programação pythonGUI (tkinter implementa o sistema de gerenciamento de informações do aluno)


prefácio

Este artigo desenvolve a interface gráfica do sistema de gerenciamento de informações do aluno por meio de pyhon e tkinter e o empacota em um aplicativo conveniente para os usuários usarem!


1. O que é tkinter?

Tkinter é um módulo de design de janela usando python, podemos realizar muitas funções intuitivas por meio da programação tkinterGUI. Como o Tkinter está embutido no pacote de instalação do python, a biblioteca tkinter pode ser usada desde que o Python esteja instalado, e o IDLE também é escrito no tkinter. Para Xiaobai, é uma boa escolha construir uma interface gráfica simples e usar o Tkinter .

2. Etapas de codificação

1. Módulo de login

código mostra como abaixo:

#编写者:cwt
#时间:2022/6/9 9:55
import tkinter as tk
from tkinter import messagebox #messagebox用于显示对话框
from db import db
from mainPage import MainPage
class LoginPage:
    def __init__(self,master):

        self.root=master
        self.root.geometry('300x180')
        self.root.title('登录页')

        self.username=tk.StringVar()
        self.password=tk.StringVar()

        self.page=tk.Frame(root)
        self.page.pack()

        tk.Label(self.page).grid(row=0,column=0)
        tk.Label(self.page,text='账户:').grid(row=1,column=1)
        tk.Entry(self.page,textvariable=self.username).grid(row=1,column=2)

        tk.Label(self.page,text='密码:').grid(row=2,column=1,pady=10)
        tk.Entry(self.page,textvariable=self.password).grid(row=2,column=2,pady=10)



        tk.Button(self.page,text='登录',command=self.login).grid(row=3,column=1, pady=10)
        tk.Button(self.page,text='退出',command=self.page.quit).grid(row=3,column=2, pady=10)



    def login(self):
        name = self.username.get()
        pwd = int(self.password.get())
        flag, message = db.check_login(name, pwd)  # 调用db库的登录验证
        if (flag):
            self.page.destroy()
            MainPage(self.root)
        else:
            messagebox.showwarning(title='警告', message=message)

if __name__ == '__main__':
    root = tk.Tk()
    LoginPage(master=root)

    root.mainloop()

2. Módulo da página principal

código mostra como abaixo:

#编写者:cwt
#时间:2022/6/11 11:58
import tkinter as tk
from views import AboutFrame,ChangeFrame,SelFrame,DelFrame,LuruFrame
class MainPage:
    def __init__(self,master:tk.Tk):
        self.root=master
        self.root.title('学生信息管理系统 v1.0')
        self.root.geometry('600x400')
        self.creatPage()
        self.show_luru()

    def creatPage(self):
        self.about_frame=AboutFrame(self.root)
        # tk.Label(self.about_frame,text='关于作品:本作品由tkinter制作').pack()
        # tk.Label(self.about_frame,text='关于作者:cwt').pack()

        self.change_frame=ChangeFrame(self.root)
        # tk.Label(self.change_frame, text='修改').pack()

        self.del_frame = DelFrame(self.root)
        # tk.Label(self.del_frame, text='删除').pack()

        self.sel_frame = SelFrame(self.root)
        # tk.Label(self.sel_frame, text='查询').pack()

        self.luru_frame = LuruFrame(self.root)
        # tk.Label(self.luru_frame, text='录入').pack()

        menubar=tk.Menu(self.root)  #创建菜单
        menubar.add_command(label='录入', command=self.show_luru)  #添加菜单
        menubar.add_command(label='查询', command=self.show_sel)
        menubar.add_command(label='删除', command=self.show_del)
        menubar.add_command(label='修改', command=self.show_change)
        menubar.add_command(label='关于', command=self.show_about)
        self.root['menu']=menubar  #绑定在root对象上


    def show_about(self):
        self.luru_frame.pack_forget()
        self.sel_frame.pack_forget()
        self.del_frame.pack_forget()
        self.change_frame.pack_forget()
        self.about_frame.pack()
    def show_change(self):
        self.about_frame.pack_forget()
        self.luru_frame.pack_forget()
        self.sel_frame.pack_forget()
        self.del_frame.pack_forget()
        # self.change_frame.pack_forget()
        self.change_frame.pack()
    def show_del(self):

        self.luru_frame.pack_forget()
        self.sel_frame.pack_forget()
        self.change_frame.pack_forget()
        self.about_frame.pack_forget()
        self.del_frame.pack()
    def show_sel(self):
        self.about_frame.pack_forget()
        self.luru_frame.pack_forget()
        self.del_frame.pack_forget()
        self.change_frame.pack_forget()
        self.sel_frame.pack()
    def show_luru(self):
        self.about_frame.pack_forget()
        self.del_frame.pack_forget()
        self.change_frame.pack_forget()
        self.sel_frame.pack_forget()
        self.luru_frame.pack()



if __name__ == '__main__':
    root=tk.Tk()
    MainPage(master=root)
    root.mainloop()

3. Módulo de operação de dados

código mostra como abaixo:

#编写者:cwt
#时间:2022/6/10 9:51
import json
class MysqlDatabases:
    def __init__(self):
        with open('users.json',mode='r',encoding='utf=8') as f:
            text=f.read()  #读取文本
        self.users=json.loads(text) #讲一个json对象解析为python对象
        self.students=json.loads((open('students.json',mode='r',encoding='utf=8').read()))  #简化操作

    def check_login(self,username,password):
        for i in self.users:
            # print(i)
            if(username==i['username']):
                if(password==i['password']):
                    return True,'登陆成功'
                else:
                    return False,'登陆失败,密码错误'
        return False,'登陆失败,用户名不存在'
    def all(self):
        return self.students

    def insert(self,stu):
        self.students.append(stu)
    def delete_by_name(self,name):
        for item in self.students:
            if item['name']==name:
                print(item)
                self.students.remove(item)
                return True,f'删除{name}成功'

        return False,f'{name}不存在'

    def search_by_name(self, name):
        for item in self.students:
            if item['name'] == name:
                print(item)
                return True, item

        return False, f'{name}不存在'
    def update(self, stu):
        for item in self.students:
            if item['name'] == stu['name']:
                item.update(stu)
                return True, f'{stu["name"]}数据修改成功!'

        return False, f'{stu["name"]}不存在'

db=MysqlDatabases()
if __name__=='__main__':
    print(db.check_login('admin',123456))
    print(db.all())
    # db.check_login=('admin',123456)
    # db.delete_by_name('张三')

    print(db.search_by_name('张三'))

4. Ver módulo

código mostra como abaixo:

#编写者:cwt
#时间:2022/6/13 7:19

# self.about_frame = tk.Frame(self.root)
# tk.Label(self.about_frame, text='关于作品:本作品由tkinter制作').pack()
# tk.Label(self.about_frame, text='关于作者:cwt').pack()
import tkinter as tk
from tkinter import ttk, messagebox

from db import db


class AboutFrame(tk.Frame):
    def __init__(self,root):
        super().__init__(root)
        # self.about_frame = tk.Frame(self.root)  #继承了tk的Frame所以不需要创建frame对象了
        tk.Label(self, text='关于作品:本作品由tkinter制作').pack()
        tk.Label(self, text='关于作者:cwt').pack()
        tk.Label(self, text='关于版本:本版本为1.0版本,功能可能不够完善,望海涵!').pack()

class ChangeFrame(tk.Frame):
    def __init__(self,root):
        super().__init__(root)
        # tk.Label(self, text='修改').pack()
        self.name = tk.StringVar()
        self.chinese = tk.StringVar()
        self.math = tk.StringVar()
        self.english = tk.StringVar()
        self.creat_page()

    def creat_page(self):
        tk.Label(self).grid(row=0, column=0, pady=10)
        tk.Label(self, text='姓 名:').grid(row=1, column=0, pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=1, column=1, pady=10)
        tk.Label(self, text='语 文:').grid(row=2, column=0, pady=10)
        tk.Entry(self, textvariable=self.chinese).grid(row=2, column=1, pady=10)
        tk.Label(self, text='数 学:').grid(row=3, column=0, pady=10)
        tk.Entry(self, textvariable=self.math).grid(row=3, column=1, pady=10)
        tk.Label(self, text='英 语:').grid(row=4, column=0, pady=10)
        tk.Entry(self, textvariable=self.english).grid(row=4, column=1, pady=10)
        tk.Button(self,text='查询',command=self.sel_change).grid(row=5,column=0,pady=10)
        tk.Button(self, text='修改',command=self.alter_change).grid(row=5, column=1, pady=10)

    def sel_change(self):
        username=self.name.get()
        students = db.all()
        # flag=0
        # for stu in students:
        #     if stu['name']==username:
        #         self.name.set(stu['name'])
        #         self.chinese.set(stu['chinese'])
        #         self.math.set(stu['math'])
        #         self.english.set(stu['english'])
        #         flag=1
        #         break
        # if(flag==0):
        #     messagebox.showinfo(title='提示', message='用户名不存在!')
        #     print('用户名不存在!')
        flag,info=db.search_by_name(username)
        if flag:
            self.name.set(info['name'])
            self.chinese.set(info['chinese'])
            self.math.set(info['math'])
            self.english.set(info['english'])
        else:
            messagebox.showinfo(title='提示', message='用户名不存在!')


    def alter_change(self):
        # students = db.all()
        # username = self.name.get()
        # chinese = self.chinese.get()
        # math = self.math.get()
        # english = self.english.get()
        # flag = 0
        # for stu in students:
        #     if stu['name'] == username:
        #         student = {
    
    "name": username, "math": math, "chinese": chinese, "english": english}
        #         db.delete_by_name(username)
        #         db.insert(student)
        #         flag = 1
        #         messagebox.showinfo(title='提示', message='数据修改成功!')
        #         print('数据修改成功!')
        #         break
        # if (flag == 0):
        #     messagebox.showinfo(title='提示', message='用户名不存在!')
        #     print('用户名不存在!')
        student = {
    
    "name": self.name.get(), "math": self.math.get(), "chinese": self.chinese.get(), "english": self.english.get()}
        flag,message=db.update(student)
        messagebox.showinfo(title='提示', message=message)

class LuruFrame(tk.Frame):
    def __init__(self,root):
        super().__init__(root)
        # tk.Label(self, text='录入').pack()
        self.name = tk.StringVar()
        self.chinese = tk.StringVar()
        self.math = tk.StringVar()
        self.english = tk.StringVar()
        self.creat_page()
        tk.Button(self,text='录入数据',command=self.luru).grid(row=5,column=1,pady=10,stick=tk.E)
        # tk.Button(self, text='录入数据').grid(row=5, columu=1, pady=10)
        # tk.Button(self, text='录入数据').grid(row=5, column=1, pady=10)


    def creat_page(self):
        tk.Label(self).grid(row=0,column=0,pady=10)
        tk.Label(self,text='姓 名:').grid(row=1, column=0,pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=1, column=1, pady=10)
        tk.Label(self, text='语 文:').grid(row=2, column=0, pady=10)
        tk.Entry(self, textvariable=self.chinese).grid(row=2, column=1, pady=10)
        tk.Label(self, text='数 学:').grid(row=3, column=0, pady=10)
        tk.Entry(self, textvariable=self.math).grid(row=3, column=1, pady=10)
        tk.Label(self, text='英 语:').grid(row=4, column=0, pady=10)
        tk.Entry(self, textvariable=self.english).grid(row=4, column=1, pady=10)

    def luru(self):
        name=self.name.get()
        chinese=int(self.chinese.get())
        math=int(self.math.get())
        english=int(self.english.get())
        stu={
    
    "name": name, "math": math, "chinese": chinese, "english": english}
        db.insert(stu)
        self.name.set('')
        self.chinese.set('')
        self.math.set('')
        self.english.set('')
        messagebox.showinfo(title='提示', message='插入数据成功')

class DelFrame(tk.Frame):
    def __init__(self,root):
        super().__init__(root)
        self.name=tk.StringVar()
        self.statue=tk.StringVar()
        self.creat_page()

    def creat_page(self):
        tk.Label(self,text='请输入学生姓名:').pack()
        tk.Entry(self,textvariable=self.name).pack()
        tk.Button(self,text='删除',command=self.delete).pack()
        tk.Label(self,textvariable=self.statue).pack()

    def delete(self):
        name=self.name.get()
        flag,message=db.delete_by_name(name)
        if flag==1:
            messagebox.showinfo(title='提示', message=message)
            self.statue.set('删除成功')
            print('删除成功')
        else:
            messagebox.showinfo(title='提示', message=message)





class SelFrame(tk.Frame):
    def __init__(self,root):
        super().__init__(root)
        self.table_view=tk.Frame()
        self.table_view.pack()
        self.creat_page()

    def creat_page(self):
        columns=('name','chinese','math','english')
        columns_value=('姓名','语文','数学','英语')
        self.tree_view=ttk.Treeview(self,show='headings', columns=columns)  #ttk更美观写
        self.tree_view.column('name',width=140,anchor='center')
        self.tree_view.column('chinese', width=140, anchor='center')
        self.tree_view.column('math',width=140,anchor='center')
        self.tree_view.column('english', width=140, anchor='center')
        self.tree_view.heading('name',text='姓名')
        self.tree_view.heading('chinese', text='语文')
        self.tree_view.heading('math', text='数学')
        self.tree_view.heading('english', text='英语')
        self.tree_view.pack(fill=tk.BOTH,expand=True)
        self.show_data_frame()
        tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady=5)

    def show_data_frame(self):
        #删除旧节点
        for _ in map(self.tree_view.delete,self.tree_view.get_children('')):  #########
            pass

        students=db.all()
        index=0
        for i in students:
             self.tree_view.insert('',index + 1,value=(
                 i['name'],i['chinese'],i['math'],i['english']
             ))



3. Etapas de embalagem do APP

1. Coloque os arquivos que precisam ser empacotados em uma pasta separada
2. Crie um ambiente virtual (os arquivos empacotados são relativamente pequenos
(1) Crie um novo ambiente virtual python -m venv venv
(2) Modifique o interpretador para um ambiente virtual
(3) Reinicie a linha de comando e use a lista de pip para verificar se o ambiente virtual está em vigor
3. Instale a biblioteca de empacotamento pip install pyinstaller
4. Execute o comando de empacotamento pyinstaller yourmainprogram.py #package the main program
Nota: pyinstaller parâmetro comumente usado
-D quando o empacotamento é empacotado em um diretório
-F Empacotado em um exe
-w não exibe a página cmd
-c exibe a página cmd

3. Exibição física

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

5. Conclusão

Se você tiver alguma dúvida, pode deixar uma mensagem na área de comentários. Vamos aprender python juntos e progredir juntos! !

Acho que você gosta

Origin blog.csdn.net/weixin_44201690/article/details/125267762
Recomendado
Clasificación