栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pythonGUI编程(tkinter实现学生信息管理系统)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pythonGUI编程(tkinter实现学生信息管理系统)


前言

本文通过pyhon、tkinter对学生信息管理系统进行图形界面开发,并打包成app,方便用户使用!


一、tkinter是什么?

Tkinter 是使用 python 进行窗口视窗设计的模块,我们可以通过tkinterGUI 编程实现很多直观的功能。由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能使用tkinter 库、而且 IDLE 也是用 tkinter 编写而成、对于小白而言,搭建一个简单的图形界面使用Tkinter 是一个不错的选择。

二、编码步骤 1.登录模块

代码如下:

#编写者: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.主页面模块

代码如下:

#编写者: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.数据操作模块

代码如下:

#编写者: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.视图模块

代码如下:

#编写者: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']
             ))



三、APP打包步骤

1、将需要打包的文件单独放在一个文件夹
2、创建一个虚拟环境(打包出来的文件相对小
(1)新建一个虚拟环境python -m venv venv
(2)修改解释器为虚拟环境
(3)重启命令行,使用pip list检查虚拟环境是否生效
3、安装打包库pip install pyinstaller
4、执行打包命令pyinstaller yourmainprogram.py #打包主程序即可
注意:pyinstaller 打包时常用参数
-D 打包成一个目录
-F 打包成一个exe
-w不显示cmd页面
-c 显示cmd页面

三、实物展示







五、结束语

各位小伙伴有疑问的地方可以在评论区留言,我们一起学习python,共同进步!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968598.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号