python+mysql+tkinter学生信息管理系统

需求分析

(1)使用mysql存储学生和管理员信息
(2)通过tkinter模块创建图形界面,实现管理员的登录,对学生信息的增删改查,以及修改管理员自己的密码。

整个工程类与方法
整个工程类与方法

数据库设计

使用mysql数据库创建
menege表和student表
在这里插入图片描述
menege表的创建

create table manege(
	user_name varchr(6) not null,
	user_pwd char(6) not null,
	user_state int(1) not null
	primary key (user_name)
	);

向表manege插入数据:
insert into manege values(admin,123456,1)

student表的创建
参考manege表的创建
在这里插入图片描述
插入数据即可

窗口设计

登录界面

在这里插入图片描述
界面展示
在这里插入图片描述

步骤:
(1)先创建login_page.py模块
(2)在该模块中创建LoginWindow类,继承于Tk

from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
import datetime
import mainGUI
import pymysql
import os

class LoginWindow(Tk):
    """创建登录窗体的GUI界面以及登录的方法"""

	#构造函数,在对象被创建后就自动运行
    def __init__(self):
        super().__init__() #先执行tk这个类的初始化
        self.title("学生信息管理系统")
        self.resizable(0,0) #窗体大小不允许变,两个参数分别代表x轴和y轴
        
        #这三个参数都是为了传入下一个界面
        self.user =""  
        self.pwd=""
        self.state=1

        # 加载窗体
        self.setup_UI()
        self.user_list = [] #存储用户信息

setup_UI()函数:

def setup_UI(self):
        # ttk中控件使用style对象设定
        self.Style01 = Style()
        self.Style01.configure("user.TLabel",font = ("华文黑体",20,"bold"),foreground = "black")
        self.Style01.configure("TEntry",font = ("华文黑体",20,"bold"))
        self.Style01.configure("TButton",font = ("华文黑体",20,"bold"),foreground = "black",bg='red')
        # 创建一个Label标签展示图片
        self.Login_image = PhotoImage(file = "."+os.sep+"images"+os.sep+"back1.png")
        self.Label_image = Label(self,image = self.Login_image,text="学生信息管理系统",compound=BOTTOM,font=("华文黑体",22,"bold"))
        self.Label_image.pack(padx = 10,pady = 10)
        # 创建一个Label标签 + Entry   --- 用户名
        self.Label_user = Label(self,text = "用户名:", style = "user.TLabel")
        self.Label_user.pack(side = LEFT,padx = 10,pady = 10)
        self.Entry_user = Entry(self,width = 12)
        self.Entry_user.pack(side = LEFT,padx = 10,pady = 10)
        # 创建一个Label标签 + Entry   --- 密码
        self.Label_password = Label(self, text = "密码:", style = "user.TLabel")
        self.Label_password.pack(side = LEFT,padx = 10,pady = 10)
        self.Entry_password = Entry(self, width=12,show = "*")
        self.Entry_password.pack(side = LEFT,padx = 10,pady = 10)
        # 创建一个按钮    --- 登录
        self.Button_login = Button(self,text = "登录",width = 4,command=lambda:self.login())
        self.Button_login.pack(side = LEFT,padx = 20,pady = 10)

load_main(self)函数

    def load_main(self):
        # 关闭当前窗体
        #
        self.destroy()
        # 加载新窗体
        if __name__ == '__main__':
            main_Window = mainGUI.MainWindow(self.user,self.get_now_time(),self.pwd,self.state)
            main_Window.mainloop()

login(self)函数

    def login(self):
        # 获取用户的用户名和密码
        user = self.Entry_user.get()
        password = self.Entry_password.get()
        db = pymysql.connect(host="localhost",user="root",passwd="123456",database="student_manegement")
        cursor = db.cursor()
        sql = "select * from manege where user_name=%s"
        cursor.execute(sql,user)
        #将得到的管理员数据存放在列表中
        self.user_list= cursor.fetchall()
        print(self.user_list)
        cursor.close()
        db.close()
        if len(self.user_list)!=0:
            if 0 == self.user_list[0][2]:
                messagebox.showinfo("系统消息","账号已禁用,请联系管理员")
            else:
                if password != str(self.user_list[0][1].strip().lower()):
                    messagebox.showinfo("系统消息","输入密码错误")
                else:
                    messagebox.showinfo("系统消息","登录成功!")
                    self.user = self.user_list[0][0]
                    self.pwd = self.user_list[0][1]
                    self.state = self.user_list[0][2]
                    self.load_main()
        else:
            messagebox.showinfo("系统消息",'输入用户名不存在')

get_now_time(self)函数

def get_now_time(self):
        today = datetime.datetime.today()
        return ("%04d-%02d-%02d %02d:%02d:%02d"%(today.year,today.month,today.day,today.hour,today.minute,today.second))

创建登录界面对象

if __name__=='__main__':
    this_login = LoginWindow()
    print(this_login.get_now_time())
    this_login.mainloop()

注意:这里一定要加上if __name__=='__main__'
否则会出现跳转不到主界面中
出现原因:
在主页面导入登录模块,因为python解释器是按顺序执行,import模块都在程序的最上方,执行到import login_page时,若没有if __name__=='__main__',则会执行创建登录界面,所以出现显示登录成功后,又跳转到登录界面。

主界面

在这里插入图片描述
界面展示
在这里插入图片描述

创建一个新的模块mainGUI.py模块

构造函数

from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
import detailGUI
import change_pwd
import login_page
import pymysql
import os
import sys
class MainWindow(Tk):
    
    def __init__(self,login_user,login_time,psw,state):
        super().__init__()
        self.title("主窗体")
        self.geometry("1050x640+180+80")
        self.resizable(0,0)
        self["bg"]="cornflowerblue"
        # 从登录界面传过来的管理员登录名和登录时间
        self.current_user = login_user
        self.current_time = login_time
        self.current_psw = psw
        self.current_state = state
        # 加载页面UI
        self.setup_UI()

        # 读取学生信息
        self.all_student_list =[] #使用一个list来存放读取的学生信息
        self.load_file_student_info()

        # 在treeview中加载学生信息
        self.load_treeview(self.all_student_list)

        # 定义一个存储查询结果的列表
        self.query_result_list = []
        
        self.current_student_list=[]
        

setup_UI(self)页面布局

    def setup_UI(self):
        # 设定Style
        self.Style01 = Style()
        self.Style01.configure("left.TPanedwindow",background ="white")
        self.Style01.configure("right.TPanedwindow",background="white")
        self.Style01.configure("TButton",width = 10,font = ("华文黑体",15,"bold"),background="white")

        # Top_banner
        self.Login_image = PhotoImage(file="."+os.sep+"images"+os.sep+"shouye.png")
        self.Label_image = Label(self,image=self.Login_image)
        self.Label_image.pack(padx=100,pady=10)
        self.Lable_login_user = Label(self,text="当前用户:"+str(self.current_user).title()+"\n登录时间:"+self.current_time)
        self.Lable_login_user.place(x=680,y=40)


        # 左边:按钮区域,创建一个容器
        self.Pane_left = PanedWindow(width=200,height=541,style="left.TPanedwindow")
        self.Pane_left.place(x=4,y=94)
        self.Pane_right = PanedWindow(width=830,height=540,style="right.TPanedwindow")
        self.Pane_right.place(x=210,y=94)

        # 添加左边按钮
        # self.Button_image = PhotoImage(file="."+os.sep+"images"+os.sep+"tianjia.png")
        self.Button_add = Button(self.Pane_left,text="添加学生",style="TButton",command=lambda:self.add_studnet())
        self.Button_add.place(x=40,y=20)
        self.Button_update = Button(self.Pane_left,text="修改学生",style="TButton",command=lambda:self.update_student())
        self.Button_update.place(x=40,y=60)
        self.Button_delete = Button(self.Pane_left,text="删除学生",style="TButton",command=lambda:self.delete_student())
        self.Button_delete.place(x=40,y=100)
        self.Button_modify = Button(self.Pane_left,text="更改密码",style="TButton",command=lambda:self.change_manege())
        self.Button_modify.place(x=40,y=230)

        # 右边:查询,TreeView
        # self.Pane_right = PanedWindow(width=725,height=540,style="right.TPanedwindow")
        # self.Pane_right.place(x=170,y=94)
        # LabelFrame
        self.LabelFrame_query = LabelFrame(self.Pane_right,text="学生信息查询",width=802,height=70)
        self.LabelFrame_query.place(x=10,y=10)

        # 添加控件
        # 学号
        self.Label_sno = Label(self.LabelFrame_query,text="学号:",style=None)
        self.Label_sno.place(x=5,y=13)
        self.Entry_sno = Entry(self.LabelFrame_query,width=8,style=None)
        self.Entry_sno.place(x=60,y=15)

        # 姓名
        self.Label_name = Label(self.LabelFrame_query,text="姓名:",style=None)
        self.Label_name.place(x=125,y=13)
        self.Entry_name = Entry(self.LabelFrame_query,width = 8,style=None)
        self.Entry_name.place(x=180,y=15)

        # 电话
        self.Label_mobile = Label(self.LabelFrame_query,text="电话:")
        self.Label_mobile.place(x=245,y=13)
        self.Entry_mobile = Entry(self.LabelFrame_query,width=8)
        self.Entry_mobile.place(x=300,y=15)

        # 学院
        self.Label_academy = Label(self.LabelFrame_query,text="学院:")
        self.Label_academy.place(x=365,y=13)
        self.Entry_academy = Entry(self.LabelFrame_query,width=8)
        self.Entry_academy.place(x=420,y=15)

        # 查询按钮
        self.Button_query = Button(self.LabelFrame_query,text="查询",width=4,command=lambda:self.get_query_result())
        self.Button_query.place(x=520,y=8)
        self.Button_showall = Button(self.LabelFrame_query,text="显示全部",width=8,command=lambda:self.load_all_student())
        self.Button_showall.place(x=590,y=8)

        # 添加TreeView控件
        self.Tree = Treeview(self.Pane_right,columns=("sno","names","academy","gender","birthday","mobile","email","address"),show="headings",height=21)

        # 设置每一个列的宽度和对齐方式
        self.Tree.column("sno",width=100,anchor="center")
        self.Tree.column("names",width=80,anchor="center")
        self.Tree.column("academy",width=120,anchor="center")
        self.Tree.column("gender",width=80,anchor="center")
        self.Tree.column("birthday",width=100,anchor="center")
        self.Tree.column("mobile",width=100,anchor="center")
        self.Tree.column("email",width=100,anchor="center")
        self.Tree.column("address",width=120,anchor="center")

        # 设置每个列的标题
        self.Tree.heading("sno",text="学号")
        self.Tree.heading("names",text="姓名")
        self.Tree.heading("academy",text="专业")
        self.Tree.heading("gender",text="性别")
        self.Tree.heading("birthday",text="生日")
        self.Tree.heading("mobile",text="手机号码")
        self.Tree.heading("email",text="邮箱地址")
        self.Tree.heading("address",text="家庭住址")

        self.Tree.place(x=10,y=80)
        #为tree绑定双击事件,双击后显示点击学生的详细信息
        self.Tree.bind("<Double-1>",self.view_student)

load_file_student_info(self)函数

    # 读取文件/数据库中学生的信息
    def load_file_student_info(self):
        # 使用数据库读取信息
        config={
            "host":"localhost",
            "user":"root",
            "password":"123456",
            "database":"student_manegement"
        }
        db = pymysql.connect(**config)
        cursor = db.cursor()
        sql = "select * from student"
        cursor.execute(sql)
        self.all_student_list = list(cursor.fetchall())
        print("使用函数查找的所有学生:",len(list(self.all_student_list)))
        cursor.close()
        db.close()

load_treeview(self,current_list:list)方法加载treeview信息

    def load_treeview(self,current_list:list):
        # 判断是否有数据:
        if len(current_list) == 0:
            messagebox.showinfo("系统消息","没有数据加载")
        else:
            for index in range(len(current_list)):
                self.Tree.insert("",index,values=(current_list[index][0],current_list[index][1],
                current_list[index][9],current_list[index][2],current_list[index][3],
                current_list[index][5],current_list[index][6],current_list[index][7]))

get_query_result(self)方法实现查询方法

        # 准备查询条件:获取学号
        query_condition = [self.Entry_sno.get(),self.Entry_name.get(),self.Entry_academy.get(),self.Entry_mobile.get()]
        if len(query_condition[0])==0 and len(query_condition[1])==0 and len(query_condition[2])==0 and len(query_condition[3])==0:
            messagebox.showinfo("系统消息","请输入要查找的内容!")
        else:
            for item in self.all_student_list:
                if query_condition[0] in str(item[0]) and query_condition[1] in item[1] and query_condition[2] in item[9] and query_condition[3] in item[5]:
                    self.query_result_list.append(item)
            for i in self.Tree.get_children():
                self.Tree.delete(i)
            self.load_treeview(self.query_result_list)
            self.query_result_list.clear()

load_all_student(self)方法
实现点击显示全部后在treeview中显示并清空输入框中的内容

    def load_all_student(self):
        for i in self.Tree.get_children():
            self.Tree.delete(i)
        # 点击显示全部按钮后输入框清空
        self.Entry_sno.delete(0,"end")
        self.Entry_name.delete(0,"end")
        self.Entry_academy.delete(0,"end")
        self.Entry_mobile.delete(0,"end")
        # 查找所有学生信息
        self.load_file_student_info()
        # 加载所有的学生信息到TreeView中
        self.load_treeview(self.all_student_list)

load_detail_window(self,flag)函数
实现加载详细窗口

def load_detail_window(self,flag):
        detail_window = detailGUI.DetailWindow(flag,self.current_student_list)
        #等待detail_window被destroy,然后继续执行以下代码
        self.wait_window(detail_window)
        #tree中刷新信息
        self.load_all_student()

add_student(self)函数
实现点击添加学生后跳转到详细窗口进行学生的添加

    def add_studnet(self):
        flag = 2
        self.current_student_list=[]
        self.load_detail_window(flag)

update_student(self)函数
实现在tree中点击一次某个学生+点击修改学生按钮跳转到详细窗口界面进行学生信息的修改,且把该点击的学生信息传入到详细窗口。

    def update_student(self):
        flag = 3
        try:
            item = self.Tree.selection()[0]
            print(item)
            Temp_student_list = self.Tree.item(item,"values")
            # 遍历获得完整学生明细信息
            for item in self.all_student_list:
                if item[0] == int(Temp_student_list[0]):
                    self.current_student_list = item
            self.load_detail_window(flag)
        except:
            messagebox.showinfo("系统消息","请选择右侧需要修改的学生!")

view_student(self,event)函数
实现当双击tree表格中的某一行数据后跳转到详细窗口界面,通过flag来设置详细窗口的控件状态。

    def view_student(self,event):
        flag = 1
        # 获取Tree表格双击某一行的数据,selection()如果没有指定参数,则表明以列表形式返回所有的item
        # 获取双击某一行的项目标识符
        item = self.Tree.selection()[0]
        print(item)
        # 这个Tree表格中的数据,只是显示了部分数据,为了显示明细窗体,我们需要加载文件中的读取出来的完整信息
        Temp_student_list = self.Tree.item(item,"values") #通过item方法,获取改列的所有元素,以元组的形式返回
        print(Temp_student_list)
        print("查看详情的所有学生",len(self.all_student_list))
        # 遍历获得完整学生明细信息
        for item in self.all_student_list:
            if item[0] == int(Temp_student_list[0]):
                self.current_student_list = item
                # print(self.current_student_list)
        
        self.load_detail_window(flag)

delete_student(self)函数
实现单击tree表格中的某一行数据后再点击删除学生按钮则删除该数据

    def delete_student(self):
        try:
            item = self.Tree.selection()[0]
            Temp_student_list = self.Tree.item(item,"values")
            config={
            "host":"localhost",
            "user":"root",
            "password":"123456",
            "database":"student_manegement"
            }
            db = pymysql.connect(**config)
            cursor = db.cursor()
            sql = "delete from student where student_id=%s"
            cursor.execute(sql,Temp_student_list[0])
            num = messagebox.askokcancel("提示","确定要删除学生:%s吗?"%Temp_student_list[1])
            if num:
                db.commit()
                messagebox.showinfo("系统消息","学生%s以被删除!"%Temp_student_list[1])
            else:
                messagebox.showinfo("系统消息","您取消了删除学生%s"%Temp_student_list[1])
            cursor.close()
            db.close()
            self.load_all_student()
        except:
            messagebox.showinfo("系统消息","请选择右侧需要删除的学生!")

change_manege(self)函数
点击修改密码后跳到修改密码窗口进行管理员密码的修改

    def change_manege(self):
        update_pwd = change_pwd.Update_pwd(self.current_user,self.current_psw,self.current_state)
        print("main窗口中的密码和状态",self.current_psw,self.current_state)
        self.wait_window(update_pwd)
        print("修改后密码:",update_pwd.psw)
        print("修改后状态:",update_pwd.state)
        if update_pwd.psw==self.current_psw and update_pwd.state==self.current_state:
            pass
        else:
            messagebox.showinfo("系统消息","请重新登录!")
            self.destroy()
            new_login = login_page.LoginWindow()
            new_login.mainloop()

学生详细信息窗口

在这里插入图片描述
添加学生信息页面展示
在这里插入图片描述
修改学生信息展示
在这里插入图片描述
查看学生详细信息展示
在这里插入图片描述
实现
新建一个detailGUI.py模块

init(self,flag,current_student)函数

# 学生窗体GUI基本布局

from tkinter import *
from tkinter import messagebox
from tkinter.ttk import *
import pymysql
import os

class DetailWindow(Toplevel):
    def __init__(self,flag,current_student):
        super().__init__()
        self.title("学生明细信息")
        self.geometry("700x600+600+150")
        self.resizable(0,0) #不能改变窗体大小
        self.flag = flag  #接收从主窗口传过来的flag来控制自己窗口的控件状态
        self.current_student_list = current_student  #接收从主窗口床过来的学生信息
        self.temp_list = []
        # 加载控件
        self.setup_UI()

load_student_detail(self)函数
展示出从主窗口点击的tree的某一行学生的详细信息

    def load_student_detail(self):
            if len(self.current_student_list) ==0:
                # messagebox.showinfo("系统消息","没有任何数据需要展示!")
                pass
            else:
                self.var_sno.set(self.current_student_list[0]) #学号
                self.var_name.set(self.current_student_list[1]) #姓名
                if "男" in self.current_student_list[2]:  #性别
                    self.var_gender.set(1)
                else:
                    self.var_gender.set(0)
                self.var_age.set(self.current_student_list[3]) #出生日期
                self.var_id.set(self.current_student_list[4]) #身份证
                self.var_mobile.set(self.current_student_list[5]) #电话
                self.var_email.set(self.current_student_list[6]) #邮箱
                self.var_home.set(self.current_student_list[7]) #地址
                self.var_studyin.set(self.current_student_list[8]) #入学时间
                self.var_academy.set(self.current_student_list[9]) #专业
                self.var_link.set(self.current_student_list[10]) #紧急联系人
                self.var_link_phone.set(self.current_student_list[11]) #紧急联系人电话

setup_UI(self)函数实现界面布局

    def setup_UI(self):
        # detail_UI(self)
        # 设置style
        self.Style02 = Style()
        self.Style02.configure("TPanedwindow")
        self.Style02.configure("title.TLabel",font = ("微软雅黑",10,"bold"))
        self.Style02.configure("TLabel",font = ("微软雅黑",14,"bold"))
        self.Style02.configure("TButton",font =("微软雅黑",16,"bold"),foreground = "navy" ,width = 10)  
        self.Style02.configure("TEntry",font=("微软雅黑",16,"bold"),width = 10)
        self.Style02.configure("large.TEntry",font=("微软雅黑",16,"bold"),width = 30)
        self.Style02.configure("TRadiobutton",font=("微软雅黑",14,"bold"))
        

        # 加载上面的banner
        self.Login_image = PhotoImage(file = "."+os.sep+"images"+os.sep+"shouye.png")
        self.Lable_image = Label(self,image=self.Login_image)  
        self.Lable_image.pack()

        # 添加一个title
        self.var_title = StringVar()
        self.Label_title = Label(self,text="==明细窗体==",style="title.TLabel")
        self.Label_title.place(x=500,y=40)

        # 加载一个pane
        self.Pane_detail = PanedWindow(self,width=690,height=450,style="TPanedwindow")
        self.Pane_detail.place(x=5,y = 88)

        # 添加属性
        # 第一排:学号
        self.Label_sno = Label(self.Pane_detail,text="学号:")
        self.Label_sno.place(x=10,y=10)
        self.var_sno = StringVar()
        self.Entry_sno = Entry(self.Pane_detail,textvariable= self.var_sno,style="TEntry")
        self.Entry_sno.place(x=62,y=15)
        # 姓名
        self.Label_name = Label(self.Pane_detail,text="姓名:",style="TLabel")
        self.Label_name.place(x=240,y=10)
        self.var_name = StringVar()
        self.Entry_name = Entry(self.Pane_detail,textvariable=self.var_name,style = "TEntry")
        self.Entry_name.place(x=300,y=15)
        # 性别
        self.Label_gender = Label(self.Pane_detail,text="性别:").place(x=480,y=10)
        self.var_gender = IntVar()
        self.Radio_man = Radiobutton(self.Pane_detail,text="男",variable=self.var_gender,value = 1,style="TRadiobutton")
        self.Radio_man.place(x=540,y=10)
        self.Radio_woman = Radiobutton(self.Pane_detail,text="女",variable=self.var_gender,value=0,style="TRadiobutton")
        self.Radio_woman.place(x=600,y=10)
        # 第二排:出生日期
        self.Label_age = Label(self.Pane_detail,text="出生日期:",style="TLabel")
        self.Label_age.place(x=10,y=60)
        self.var_age = StringVar()
        self.Entry_age = Entry(self.Pane_detail,textvariable=self.var_age,style="TEntry")
        self.Entry_age.place(x=110,y=65)
        # 身份证号码
        self.Label_id = Label(self.Pane_detail,text="身份证号码:",style="TLabel")
        self.Label_id.place(x=280,y=60)
        self.var_id = StringVar()
        self.Entry_id = Entry(self.Pane_detail,textvariable=self.var_id,width =35)
        self.Entry_id.place(x=400,y=65)
        # 第三排:手机号码
        self.Label_mobile = Label(self.Pane_detail,text="电话号码:",style="TLabel")
        self.Label_mobile.place(x=10,y=110)
        self.var_mobile = StringVar()
        self.Entry_mobile = Entry(self.Pane_detail,textvariable=self.var_mobile,style="TEntry")
        self.Entry_mobile.place(x=110,y=115)
        # 邮箱地址
        self.Label_email = Label(self.Pane_detail,text="邮箱地址:",style="TLabel")
        self.Label_email.place(x=280,y=110)
        self.var_email = StringVar()
        self.Entry_email = Entry(self.Pane_detail,textvariable=self.var_email,width =35)
        self.Entry_email.place(x=400,y=115)

        # 第四排:家庭住址
        self.Label_home = Label(self.Pane_detail,text="家庭住址:",style="TLabel")
        self.Label_home.place(x=10,y=160)
        self.var_home = StringVar()
        self.Entry_home = Entry(self.Pane_detail,textvariable=self.var_home,width=60)
        self.Entry_home.place(x=110,y=165)

        # 第五排:入学时间
        self.Label_studyin = Label(self.Pane_detail,text="入学时间:",style = "TLabel")
        self.Label_studyin.place(x=10,y=210)
        self.var_studyin = StringVar()
        self.Entry_studyin = Entry(self.Pane_detail,textvariable=self.var_studyin,style="TEntry")
        self.Entry_studyin.place(x=110,y=215)
        # 专业
        self.Label_academy = Label(self.Pane_detail,text="专业:",style="TLabel")
        self.Label_academy.place(x=320,y=210)
        self.var_academy = StringVar()
        self.Entry_academy = Entry(self.Pane_detail,textvariable=self.var_academy,width = 25)
        self.Entry_academy.place(x=400,y=215)

        # 第六排:紧急联系人
        self.Label_link = Label(self.Pane_detail,text="紧急联系人:",style="TLabel")
        self.Label_link.place(x=10,y=260)
        self.var_link = StringVar()
        self.Entry_link = Entry(self.Pane_detail,textvariable=self.var_link,style="TEntry")
        self.Entry_link.place(x=140,y=265)
        # 紧急联系人电话
        self.Label_link_phone = Label(self.Pane_detail,text="紧急联系人电话:",style="TLabel")
        self.Label_link_phone.place(x=320,y=260)
        self.var_link_phone = StringVar()
        self.Entry_link_phone = Entry(self.Pane_detail,textvariable=self.var_link_phone,style="TEntry")
        self.Entry_link_phone.place(x=500,y=265)

        # 放置两个按钮
        self.Button_save = Button(self,text="保存",style="TButton",command=lambda:self.commit())
        self.Button_save.place(x=350,y=550)
        self.Button_exit = Button(self,text="关闭",style="TButton",command=lambda:self.close_window())
        self.Button_exit.place(x=510,y=550)
        
        #初始化界面数据及控件状态
        self.load_student_detail()
        self.load_windows_flag()

def load_windows_flag(self):函数

def load_windows_flag(self):
        if self.flag == 1:
            self.Label_title.configure(text="==查看学生明细==")
            
            self.Button_save.place_forget()
            self.Entry_sno["state"] = DISABLED
            self.Entry_name["state"] = DISABLED
            self.Radio_man["state"] = DISABLED
            self.Radio_woman["state"] = DISABLED
            self.Entry_age["state"] = DISABLED
            self.Entry_id["state"] = DISABLED
            self.Entry_mobile["state"] = DISABLED
            self.Entry_email["state"] = DISABLED
            self.Entry_home["state"] = DISABLED
            self.Entry_studyin["state"] = DISABLED
            self.Entry_academy["state"] = DISABLED
            self.Entry_link["state"] = DISABLED
            self.Entry_link_phone["state"] = DISABLED
        elif self.flag == 2:
            self.Label_title.configure(text = "==新建学生明细==")
        elif self.flag == 3:
            self.Label_title.configure(text = "==修改学生明细==")
            self.Entry_sno["state"] = DISABLED

commit(self)函数
点击保存按钮,实现添加、修改学生信息

    def commit(self):
        if self.flag == 1:
            pass
        else :        
            #添加学生信息
            if self.flag ==2: 
                break_flag=1
                try:
                    while break_flag:
                        self.get_input()
                        if len(self.Entry_sno.get())==0 or len(self.Entry_name.get()) == 0 or len(self.Entry_id.get())==0 or len(self.Entry_mobile.get())==0 or len(self.Entry_studyin.get())==0 or len(self.Entry_academy.get())==0 or len(self.Entry_link.get())==0 or len(self.Entry_link_phone.get())==0:
                            messagebox.showinfo("系统消息","学号、姓名、身份证、电话号码、入学时间、专业、联系人及联系人电话都不能为空!")   
                        else:
                            self.get_input()
                            sql = "insert into student values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                            self.connect_database(sql,(self.temp_list[0],
                                                    self.temp_list[1],
                                                    self.temp_list[2],
                                                    self.temp_list[3],
                                                    self.temp_list[4],
                                                    self.temp_list[5],
                                                    self.temp_list[6],
                                                    self.temp_list[7],
                                                    self.temp_list[8],
                                                    self.temp_list[9],
                                                    self.temp_list[10],
                                                    self.temp_list[11]))
                            messagebox.showinfo("系统消息","学生信息添加成功")
                            break_flag=messagebox.askyesno("提示","继续添加学生?")
                            if break_flag:
                                self.Entry_sno.delete(0,"end")
                                self.Entry_name.delete(0,"end")
                                # self.var_gender.delete(0,"end")
                                self.Entry_age.delete(0,"end")
                                self.Entry_id.delete(0,"end")
                                self.Entry_mobile.delete(0,"end")
                                self.Entry_email.delete(0,"end")
                                self.Entry_home.delete(0,"end")
                                self.Entry_studyin.delete(0,"end")
                                self.Entry_academy.delete(0,"end")
                                self.Entry_link.delete(0,"end")
                                self.Entry_link_phone.delete(0,"end")
                    # 保存后销毁此窗口
                    self.destroy()
                except pymysql.err.OperationalError as e:
                    messagebox.showerror("错误",e)
                except pymysql.err.DataError as e:
                    messagebox.showerror("错误",e)
                        
                # 修改学生信息
            elif self.flag == 3:
                self.get_input()
                print(self.temp_list)
                if len(self.Entry_sno.get())==0 or len(self.Entry_name.get()) == 0 or len(self.Entry_id.get())==0 or len(self.Entry_mobile.get())==0 or len(self.Entry_studyin.get())==0 or len(self.Entry_academy.get())==0 or len(self.Entry_link.get())==0 or len(self.Entry_link_phone.get())==0:
                    messagebox.showinfo("系统消息","学号、姓名、身份证、电话号码、入学时间、专业、联系人及联系人电话都不能为空!")
                else:
                    self.get_input()
                    sql = "update student set name=%s,gender=%s,brith_day=%s,ident=%s,mobile=%s,email=%s,home=%s,studyin=%s,academy=%s,link=%s,link_phone=%s  where student_id = %s"
                    self.connect_database(sql,(self.temp_list[1],
                                            self.temp_list[2],
                                            self.temp_list[3],
                                            self.temp_list[4],
                                            self.temp_list[5],
                                            self.temp_list[6],
                                            self.temp_list[7],
                                            self.temp_list[8],
                                            self.temp_list[9],
                                            self.temp_list[10],
                                            self.temp_list[11],
                                            self.temp_list[0]))
                    messagebox.showinfo("系统消息","学生信息修改成功!")
                    # 保存后销毁此窗口
                    self.destroy()

*connect_database(self,sql,value)函数进行对数据库的操作

    def connect_database(self,sql,*value):
        config={
                    "host":"localhost",
                    "user":"root",
                    "password":"123456",
                    "database":"student_manegement"
                }
        db = pymysql.connect(**config)
        cursor = db.cursor()
        cursor.execute(sql,*value)
        
        db.commit()
        # self.find_all=cursor.fetchall()
        cursor.close()
        db.close()

get_input(self)函数获取输入框中的数据

   def get_input(self):
        # 获取输入框信息保存到list中
        self.temp_list = []
        
        self.temp_list.append(int(self.Entry_sno.get()))
        self.temp_list.append(self.Entry_name.get().strip())
        if self.var_gender.get() == 1:
            self.temp_list.append("男")
        else:
            self.temp_list.append("女")
        self.temp_list.append(self.Entry_age.get().strip())
        self.temp_list.append(self.Entry_id.get().strip())
        self.temp_list.append(self.Entry_mobile.get().strip())
        self.temp_list.append(self.Entry_email.get().strip())
        self.temp_list.append(self.Entry_home.get().strip())
        self.temp_list.append(self.Entry_studyin.get().strip())
        self.temp_list.append(self.Entry_academy.get().strip())
        self.temp_list.append(self.Entry_link.get().strip())
        self.temp_list.append(self.Entry_link_phone.get().strip())

修改密码界面

在这里插入图片描述

修改密码界面展示
在这里插入图片描述
实现

新建一个change_pwd.py模块

from tkinter import *
from tkinter import messagebox
from tkinter.ttk import *
import pymysql
import os

class Update_pwd(Toplevel):
    def __init__(self,user,psw,state):
        super().__init__()
        self.title("修改密码")
        self.geometry("500x500+100+80")
        self.resizable(0,0)
        self["bg"]="cornflowerblue"
        self.user = user
        self.current_user=[]
        self.psw = psw
        self.state = state
        self.setup_UI()
        
    def setup_UI(self):
        self.Style03 = Style()
        self.Style03.configure("TPanedwindow",background="white")
        self.Style03.configure("TRadiobutton",font=("微软雅黑",12,"bold"),background="white")
        self.Style03.configure("TLabel",background="white")
        
        self.Pane_change = Panedwindow(self,width=450,height=450,style="TPanedwindow")
        self.Pane_change.place(x=25,y=25)
        
        self.Lable_username = Label(self.Pane_change,text="用户名",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
        self.Lable_username.place(x=50,y=100)
        self.var_username = StringVar()
        self.var_username.set(self.user)
        self.Entry_username = Entry(self.Pane_change,textvariable=self.var_username,font=("微软雅黑",14,"bold"))
        self.Entry_username.place(x=115,y=100)
        self.Entry_username["state"] = DISABLED
        
        self.Lable_userpwd_old = Label(self.Pane_change,text="原密码",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
        self.Lable_userpwd_old.place(x=50,y=150)
        self.var_userpwd_old = StringVar()
        self.Entry_userpwd_old = Entry(self.Pane_change,textvariable=self.var_userpwd_old,font=("微软雅黑",14,"bold"))
        self.Entry_userpwd_old.place(x=115,y=150)
        
        self.Lable_userpwd = Label(self.Pane_change,text="新密码",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
        self.Lable_userpwd.place(x=50,y=200)
        self.var_userpwd = StringVar()
        self.Entry_userpwd = Entry(self.Pane_change,textvariable=self.var_userpwd,font=("微软雅黑",14,"bold"))
        self.Entry_userpwd.place(x=115,y=200)
        
        self.Lable_userstate = Label(self.Pane_change,text="状态",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
        self.Lable_userstate.place(x=70,y=250)
        self.var_userstate = StringVar()
        self.Radio_frozen = Radiobutton(self.Pane_change,text="正常",variable=self.var_userstate,value = 1,style="TRadiobutton")
        self.Radio_frozen.place(x=115,y=252)
        self.Radio_disfrozen = Radiobutton(self.Pane_change,text="冻结",variable=self.var_userstate,value=0,style="TRadiobutton")
        self.Radio_disfrozen.place(x=170,y=252)
        
        self.Button_OK = Button(self.Pane_change,text="确定",command=lambda:self.commit())
        self.Button_OK.place(x=80,y=300)
        self.Button_Cancel = Button(self.Pane_change,text="取消",command=lambda:self.cancel())
        self.Button_Cancel.place(x=220,y=300)
        
        
        
        
    def load_database(self,sql,*value):
        config={
            "host":"localhost",
            "user":"root",
            "password":"123456",
            "database":"student_manegement"
        }
        db = pymysql.connect(**config)
        cursor = db.cursor()
        cursor.execute(sql,*value)
        db.commit()
        self.current_user = cursor.fetchall()
        cursor.close()
        db.close()
        
    def commit(self):
        if len(self.var_userpwd.get())==0 or len(self.var_userpwd_old.get())==0 or len(self.var_userstate.get())==0:
            messagebox.showinfo("系统信息","输入框不能为空!")
        else:
            manege_list = []
            manege_list.append(self.var_userpwd_old.get())
            manege_list.append(self.var_userpwd.get())
            manege_list.append(self.var_userstate.get())
            print(manege_list)
            
            if manege_list[0]==self.psw:
                
                sql = "select * from manege where user_name=%s"
                self.load_database(sql,self.user)
                sql = "update manege set user_pwd=%s,user_state=%s where user_name=%s"
                self.load_database(sql,(manege_list[1],manege_list[2],self.user))
                messagebox.showinfo("系统消息","更改成功,请重新登录")
                print("修改密码后:",self.current_user)
                self.psw = manege_list[1]
                self.state=manege_list[2]
                self.destroy()
            else:
                messagebox.showinfo("系统消息","原密码输入错误!请重新输入")
    def cancel(self):
        self.destroy()

  • 22
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值