学生管理系统-Python tkinter图形化界面+sqlserver+柱状图

参考了大佬的,把mysql数据库改成了sqlserver

附上大佬的代码链接

https://blog.csdn.net/qq_45811949/article/details/106065845?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159192396719195239844044%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159192396719195239844044&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-106065845.ecpm_v1_rank_ctr_v2&utm_term=python%E5%9B%BE%E5%BD%A2%E5%8C%96%E5%AD%A6%E7%94%9F%E7%AE%A1%E7%90%86

程序我都写到了一个.py文件中,之前做的课程作业,现在看起来有点凌乱,

需要先在sqlserver中新建一个XSCJ数据库,里面有两张表,一个student表,一个teacher

创建表的语句在程序的开头,我注释掉了,先取消掉那个注释,创建完再注释掉就可以了

 

前两张图片是背景图片,必须用gif格式的(我也不知为什么),还有一个图标ico格式的,网上随便找一个

 

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第1张图片学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第2张图片

这是主界面,可以注册和选择角色登录

学生的功能仅有查询自己的成绩和修改密码,老师拥有所有权限

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第3张图片

学生的功能就不演示了,直接上教师的功能。

一、这是显示所有学生信息

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第4张图片

二、添加学生信息直接输入在上面的文本框,点击添加就可以了

三、删除学生信息,选中表格中的数据,点删除即可,

四、修改学生信息

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第5张图片

五、查询学生信息,可用两种查询方式,学号和姓名都可单独查询

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第6张图片

六、统计学生信息,可现实最高分、最低分、平均分、及格等的统计

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第7张图片

点击柱形图即可统计

学生管理系统-Python tkinter图形化界面+sqlserver+柱状图_第8张图片

 

我的源代码如下,执行如果出错请先检查数据库,图片要和源程序放在同一路径下

import tkinter
from tkinter import *
from tkinter import ttk
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import time
#导入ADO接口模块
from tkinter import messagebox
from tkinter.messagebox import *
import pymssql
import win32com.client
#连接服务器和数据库
cn=win32com.client.Dispatch('ADODB.Connection')
cnstr='Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=(local)'
cn.Open(cnstr,'sa','sa')
#打开数据库
cn.Execute("USE XSCJ")
#创建表
#cn.Execute("CREATE TABLE student( cno varchar(50), cname varchar(50),password varchar(50),english int, math int, python int,DW int)")
#cn.Execute("CREATE TABLE teacher( name varchar(50),password varchar(50))")
#建立记录集合
rs=win32com.client.Dispatch('ADODB.RecordSet')

server = 'DESKTOP-FIHLQ0U'
user ='sa'
userpassword ='sa'
database = 'XSCJ'
conn = pymssql.connect(server,user,userpassword,database)
cursor = conn.cursor()

def Main():
    rt = Tk()
    rt.title('学生成绩管理系统')
    rt.geometry('605x328+800+200')
    rt.iconbitmap('77.ico')

    bg = PhotoImage(file='背景.gif')
    lab1 = Label(image=bg)
    lab1.place(x=0, y=0)
    Label(text='账户',font=("宋体",'12')).place(x=120, y=90)
    Label(text='密码',font=("宋体",'12')).place(x=120, y=130)
    e1=Entry(width=30)
    e1.focus()
    e1.place(x=190, y=90)
    e2=Entry(show='*', width=30)
    e2.place(x=190, y=130)


    # 获取当前时间
    def getTime():
        timeStr = time.strftime('%Y-%m-%d %H:%M')
        Rtime.configure(text=timeStr)
        #rt.after(1000, getTime)# 每隔1s调用函数 getTime 自身获取时间

    # 时间显示
    Rtime = tkinter.Label(rt, text='', bg='white')
    Rtime.place(x=220, y=40)
    getTime()

    def XSDL():

        s1=e1.get()
        s2=e2.get()

        cursor.execute("SELECT * FROM student WHERE CNO='%s' AND PASSWORD = '%s' " % (s1, s2))
        T=cursor.fetchone()
        if T is None:
            messagebox.showerror('登录失败', '账户或密码错误!')
        else:
            messagebox.showinfo("成功", "登录成功" )
            rt.destroy()
            rt1 = Tk()
            rt1.title('学生登录')
            rt1.geometry('605x328+800+200')
            rt1.iconbitmap('77.ico')


            def qx():
                rt1.destroy()
                Main()

            def CXCJ():

                rt2 = Tk()
                rt2.title('学生登录')
                rt2.geometry('800x400+800+200')
                rt2.iconbitmap('77.ico')
                columns = ("学号", "姓名", "英语", "数学", "python", "DW")
                tree = ttk.Treeview(rt2,height=15, show="headings", columns=columns)  # 隐藏首列
                tree.column("学号", width=100)  # 表示列,不显示
                tree.column("姓名", width=100)
                tree.column("英语", width=100)
                tree.column("数学", width=100)
                tree.column("python", width=100)
                tree.column("DW", width=100)

                tree.place(x=100, y=10)
                tree.heading("学号", text='学号', anchor=CENTER)
                tree.heading("姓名", text='姓名', anchor=CENTER)
                tree.heading("英语", text='英语', anchor=CENTER)
                tree.heading("数学", text='数学', anchor=CENTER)
                tree.heading("python", text='python', anchor=CENTER)
                tree.heading("DW", text='DW', anchor=CENTER)

                def qx2():
                    rt2.destroy()


                Button(rt2,command=qx2, text="取消", width=10).place(x=500, y=350)

                cursor.execute("select CNO,CNAME,ENGLISH,MATH,PYTHON,DW from student  where cno='%s'"% s1)
                T = cursor.fetchall()
                for row in T:
                    tree.insert("", 0, values=(row[0], row[1], row[2], row[3], row[4], row[5]))

            def XGMM():
                Label(text='学号').place(x=100, y=70)
                Label(text='旧密码:').place(x=100, y=95)
                Label(text='新密码:').place(x=100, y=120)

                e3 = Entry(width=30)
                e3.place(x=200, y=70)
                e4 = Entry(show='*', width=30)
                e4.place(x=200, y=95)
                e5 = Entry(show='*', width=30)
                e5.place(x=200, y=120)

                def qr():
                    s3 = e3.get()
                    s4 = e4.get()
                    s5 = e5.get()
                    cursor.execute("SELECT * FROM student WHERE CNO='%s' AND PASSWORD = '%s' " % (s3, s4))
                    T = cursor.fetchone()
                    if T is None:
                        messagebox.showerror('修改失败', '账户或密码错误!')
                    else:
                        rs.LockType = 4
                        cursor.execute("UPDATE  STUDENT SET PASSWORD='%s' WHERE CNO= '%s' " % (s5, s3))
                        conn.commit()
                        messagebox.showinfo("成功", '密码修改成功!!!')


                Button(command=qr, text="确认", width=10).place(x=140, y=150)
                Button(command=quit, text="退出", width=10).place(x=240, y=150)
                Button(command=qx, text="回到首页", width=10).place(x=340, y=150)

            Button(command=XGMM, text="修改密码", width=10).place(x=140, y=150)
            Button(command=CXCJ, text="查询成绩", width=10).place(x=240, y=150)
            Button(command=qx, text="回到首页", width=10).place(x=340, y=150)


    def JSDL():

        s1=e1.get()
        s2=e2.get()
        cursor.execute("SELECT * FROM teacher WHERE name='%s' AND PASSWORD = '%s' " % (s1, s2))
        T=cursor.fetchone()
        if T is None:
            messagebox.showerror('登录失败', '账户或密码错误!')
        else:
            messagebox.showinfo("成功", "登录成功" )
            rt.destroy()
            rt1 = Tk()
            rt1.title('学生成绩管理')
            rt1.geometry('920x600+600+100')
            rt1.iconbitmap('77.ico')

            Label(text='学生成绩管理',font=20,fg='red').place(x=350, y=10)
            Label(text='学号:',font=10).place(x=10, y=50)
            Label(text='姓名:',font=10).place(x=310, y=50)
            Label(text='英语:',font=10).place(x=610, y=50)
            Label(text='数学:',font=10).place(x=10, y=100)
            Label(text='python:',font=10).place(x=310, y=100)
            Label(text='DW:',font=10).place(x=610, y=100)

            e3 = Entry(width=30)
            e3.focus()
            e3.place(x=90, y=50)
            e4 = Entry(width=30)
            e4.place(x=390, y=50)
            e5 = Entry(width=30)
            e5.place(x=690, y=50)
            e6 = Entry(width=30)
            e6.place(x=90, y=100)
            e7 = Entry(width=30)
            e7.place(x=390, y=100)
            e8 = Entry(width=30)
            e8.place(x=690, y=100)

            def qx():
                rt1.destroy()
                Main()



            # 显示所有项目
            def get():
                #清空表格
                def delButton(tree):
                    x = tree.get_children()
                    for item in x:
                        tree.delete(item)
                delButton(tree)
                cursor.execute("select CNO,CNAME,ENGLISH,MATH,PYTHON,DW from student order by cno desc")
                T = cursor.fetchall()
                for row in T:
                    tree.insert("", 0, values=(row[0],row[1], row[2],row[3], row[4],row[5]))

            #添加学生信息
            def add():
                s3 = e3.get()
                s4 = e4.get()
                s5 = e5.get()
                s6 = e6.get()
                s7 = e7.get()
                s8 = e8.get()

                if len(e3.get()) == 0 and len(e4.get()) == 0:
                    messagebox.showerror("添加失败", "学号不能为空!")
                else:
                    cursor.execute("SELECT * FROM student WHERE CNO='%s' " % (s3))
                    T = cursor.fetchone()
                    if T is None:
                        rs.LockType = 4
                        cursor.execute(
                            "INSERT INTO STUDENT(CNO,CNAME,ENGLISH,MATH,PYTHON,DW) VALUES('%s','%s','%s','%s','%s','%s')" % (
                                s3, s4, s5, s6, s7, s8))
                        conn.commit()
                        messagebox.showinfo("提示", "添加成功!")
                        tree.insert("", 0, values=(s3, s4, s5, s6, s7, s8))
                    else:
                        messagebox.showerror('添加失败', '该学生已存在!')

            # 删除学生成绩
            def delete():
                message['text'] = ''
                try:
                    tree.item(tree.selection())['values'][0]
                except IndexError as e:
                    message['text'] = '请选择操作项目'
                    return
                message['text'] = ''
                cno = tree.item(tree.selection())['values'][0]
                rs.LockType = 4
                cursor.execute("delete from student where cno='%s'" % cno)
                conn.commit()
                message['text'] = '{}号删除成功'.format(cno)
                get()

            # 修改学生成绩
            def edit():
                message['text'] = ''
                try:
                    tree.item(tree.selection())['values'][0]
                except IndexError as e:
                    message['text'] = '请选择操作项目'
                    return
                old_cno = tree.item(tree.selection())['values'][0]
                old_name = tree.item(tree.selection())['values'][1]
                old_english = tree.item(tree.selection())['values'][2]
                old_math = tree.item(tree.selection())['values'][3]
                old_python = tree.item(tree.selection())['values'][4]
                old_DW = tree.item(tree.selection())['values'][5]
                #顶级窗口
                edit_win = Toplevel()
                edit_win.title('修改学生信息')
                screenwidth = edit_win.winfo_screenwidth()
                screenheight = edit_win.winfo_screenheight()
                width = 300
                high = 350
                edit_win.geometry('%dx%d+%d+%d' % (width, high, (screenwidth - width) / 2, (screenheight - high) / 2))


                # 原来的项目
                Label(edit_win, text='学号').grid(row=0, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_cno), state='readonly').grid(
                    row=0, column=2)

                Label(edit_win, text='原来姓名').grid(row=2, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_name), state='readonly').grid(
                    row=2, column=2)

                Label(edit_win, text='新的姓名').grid(row=3, column=1)
                new_name = Entry(edit_win, textvariable=StringVar(edit_win, value=old_name))
                new_name.grid(row=3, column=2)

                Label(edit_win, text='原来英语成绩').grid(row=4, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_english), state='readonly').grid(
                    row=4, column=2)

                Label(edit_win, text='新的英语成绩').grid(row=5, column=1)
                new_english = Entry(edit_win, textvariable=StringVar(edit_win, value=old_english))
                new_english.grid(row=5, column=2)

                Label(edit_win, text='原来数学成绩').grid(row=6, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_math), state='readonly').grid(
                    row=6, column=2)

                Label(edit_win, text='新的数学成绩').grid(row=7, column=1)
                new_math = Entry(edit_win, textvariable=StringVar(edit_win, value=old_math))
                new_math.grid(row=7, column=2)

                Label(edit_win, text='原来python成绩').grid(row=8, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_python), state='readonly').grid(
                    row=8, column=2)

                Label(edit_win, text='新的python成绩').grid(row=9, column=1)
                new_python = Entry(edit_win, textvariable=StringVar(edit_win, value=old_python))
                new_python.grid(row=9, column=2)

                Label(edit_win, text='原来DW成绩').grid(row=10, column=1)
                Entry(edit_win, textvariable=StringVar(edit_win, value=old_DW), state='readonly').grid(
                    row=10, column=2)

                Label(edit_win, text='新的DW成绩').grid(row=11, column=1)
                new_DW = Entry(edit_win, textvariable=StringVar(edit_win, value=old_DW))
                new_DW.grid(row=11, column=2)

                # 数据修改处理
                def edit_record():
                    s3 = new_name.get()
                    s4 = new_english.get()
                    s5 = new_math.get()
                    s6 = new_python.get()
                    s7 = new_DW.get()

                    rs.LockType = 4
                    cursor.execute("update student set cname='%s',english='%s',math='%s',python='%s',DW='%s' where cno='%s' " % ( s3,s4,s5,s6,s7,old_cno))
                    conn.commit()
                    edit_win.destroy()
                    message['text'] = "{}更新成功".format(old_cno)
                    get()

                Button(edit_win, text='更新',
                       command=edit_record).grid(row=12, column=2, sticky=W + E)

                edit_win.mainloop()###

            #查询学生成绩
            def select():

                top = Toplevel()
                top.title('查询学生信息')

                screenwidth = top.winfo_screenwidth()
                screenheight = top.winfo_screenheight()
                width = 800
                high = 600
                top.geometry('%dx%d+%d+%d' % (width, high, (screenwidth - width) / 2, (screenheight - high) / 2))

                Label(top,text='请输入学号').place(x=100, y=10)

                l1 = Entry(top,width=30)
                l1.place(x=200, y=10)

                Label(top,text='请输入姓名').place(x=100, y=50)

                l2 = Entry(top,width=30)
                l2.place(x=200, y=50)

                columns = ("学号", "姓名", "英语", "数学", "python", "DW")
                tree = ttk.Treeview(top,height=15, show="headings", columns=columns)  # 隐藏首列
                tree.column("学号", width=100)  # 表示列,不显示
                tree.column("姓名", width=100)
                tree.column("英语", width=100)
                tree.column("数学", width=100)
                tree.column("python", width=100)
                tree.column("DW", width=100)

                tree.place(x=100, y=100)
                tree.heading("学号", text='学号', anchor=CENTER)
                tree.heading("姓名", text='姓名', anchor=CENTER)
                tree.heading("英语", text='英语', anchor=CENTER)
                tree.heading("数学", text='数学', anchor=CENTER)
                tree.heading("python", text='python', anchor=CENTER)
                tree.heading("DW", text='DW', anchor=CENTER)

                def qx2():
                    top.destroy()


                def qk():
                    # 清空表格
                    def delButton(tree):
                        x = tree.get_children()
                        for item in x:
                            tree.delete(item)
                    delButton(tree)
                    l1.delete(0, 'end')
                    l2.delete(0, 'end')


                def qr():
                    # 清空表格
                    def delButton(tree):
                        x = tree.get_children()
                        for item in x:
                            tree.delete(item)
                    delButton(tree)
                    t1=l1.get()
                    t2=l2.get()
                    cursor.execute("select CNO,CNAME,ENGLISH,MATH,PYTHON,DW from student  where cno='%s'" % t1)
                    T = cursor.fetchall()
                    for row in T:
                        tree.insert("", 0, values=(row[0], row[1], row[2], row[3], row[4], row[5]))
                    cursor.execute("select CNO,CNAME,ENGLISH,MATH,PYTHON,DW from student  where cname='%s'" % t2)
                    T = cursor.fetchall()
                    for row in T:
                        tree.insert("", 0, values=(row[0], row[1], row[2], row[3], row[4], row[5]))

                Button(top,command=qr, text="查询", width=10).place(x=200, y=450)
                Button(top,command=qk, text="清空", width=10).place(x=350, y=450)
                Button(top,command=qx2, text="取消", width=10).place(x=500, y=450)

            #清空按钮
            def qk():

                e3.delete(0,'end')
                e4.delete(0, 'end')
                e5.delete(0, 'end')
                e6.delete(0, 'end')
                e7.delete(0, 'end')
                e8.delete(0, 'end')

            #统计模块
            def tj():

                def xs():
                    if cursor.execute("select max(english) , min(english), round(avg(english),1),COUNT (case when english between 0 and 59 then 1 end),COUNT (case when english between 60 and 69 then 1 end),COUNT (case when english between 70 and 79 then 1 end),COUNT (case when english between 80 and 89 then 1 end),COUNT (case when english between 90 and 100 then 1 end),count(*) from student")!=0:
                        S1 = cursor.fetchall()
                        S1 = ("英语",) + S1[0]
                        tree.insert("", 0, values=S1)

                        cursor.execute(
                            "select max(math), min(math), round(avg(math),1),COUNT (case when math between 0 and 59 then 1 end),COUNT (case when math between 60 and 69 then 1 end),COUNT (case when math between 70 and 79 then 1 end),COUNT (case when math between 80 and 89 then 1 end),COUNT (case when math between 90 and 100 then 1 end), count(*) from student")
                        S2 = cursor.fetchall()
                        S2 = ("数学",) + S2[0]
                        tree.insert("", 1, values=S2)

                        cursor.execute(
                            "select max(python) , min(python), round(avg(python),1),COUNT (case when python between 0 and 59 then 1 end),COUNT (case when python between 60 and 69 then 1 end),COUNT (case when python between 70 and 79 then 1 end),COUNT (case when python between 80 and 89 then 1 end),COUNT (case when python between 90 and 100 then 1 end),count(*) from student")
                        S3 = cursor.fetchall()
                        S3 = ("Python",) + S3[0]
                        tree.insert("", 0, values=S3)

                        cursor.execute(
                            "select max(DW), min(DW), round(avg(DW),1),COUNT (case when DW between 0 and 59 then 1 end),COUNT (case when DW between 60 and 69 then 1 end),COUNT (case when DW between 70 and 79 then 1 end),COUNT (case when DW between 80 and 89 then 1 end),COUNT (case when DW between 90 and 100 then 1 end), count(*) from student")
                        S4 = cursor.fetchall()
                        S4 = ("数据仓库",) + S4[0]
                        tree.insert("", 1, values=S4)
                    else:
                        showerror("统计失败", "没有学生数据无法进行统计")

                def chart():
                    """"统计数据的柱状图"""
                    # 柱状图
                    # 使图形中的中文正常编码显示
                    mpl.rcParams["font.sans-serif"] = ["SimHei"]
                    # 每个柱子下标的索引
                    cursor.execute("select * from student")
                    stu_tuple = cursor.fetchall()

                    x = np.arange(len(stu_tuple))

                    y = [x[5] for x in stu_tuple]
                    y1 = [x[6] for x in stu_tuple]
                    y2= [x[3] for x in stu_tuple]
                    y3 = [x[4] for x in stu_tuple]


                    # 柱子的宽度
                    bar_width = 0.2
                    tick_label = [x[2] for x in stu_tuple]

                    # 绘制柱状图并设置其各项属性
                    plt.bar(x, y, bar_width, align="center", color="c", label="Python", alpha=0.5)
                    plt.bar(x + bar_width, y1, bar_width, color="b", align="center", label="DW", alpha=0.5)
                    plt.bar(x + 2*bar_width, y2, bar_width, color="r", align="center", label="英语", alpha=0.5)
                    plt.bar(x + 3*bar_width, y3, bar_width, color="orange", align="center", label="数学", alpha=0.5)
                    plt.tight_layout(pad=0.4, w_pad=10.0, h_pad=3.0)
                    plt.title("学生成绩统计表")
                    plt.xlabel("姓名")
                    plt.ylabel("成绩")

                    plt.xticks(x + bar_width / 2, tick_label)
                    plt.xticks(rotation=-90)
                    plt.yticks(np.arange(0, 101, 20))

                    # 添加图例
                    plt.legend(loc="upper left")
                    plt.show()

                """创建显示统计的窗口"""
                top = Toplevel()
                top.title('统计学生信息')

                screenwidth = top.winfo_screenwidth()
                screenheight = top.winfo_screenheight()
                width = 700
                high = 500
                top.geometry('%dx%d+%d+%d' % (width, high, (screenwidth - width) / 2, (screenheight - high) / 2))

                # 创建显示数据的表格
                tree = ttk.Treeview(top, show='headings', column=('object', 'max', 'min', 'average', 'fail',
                                                                            'pass', 'middle', 'good', 'super', 'count'))
                tree.column('object', width=50, anchor="center")
                tree.column('max', width=50, anchor="center")
                tree.column('min', width=50, anchor="center")
                tree.column('average', width=50, anchor="center")
                tree.column('fail', width=50, anchor="center")
                tree.column('pass', width=50, anchor="center")
                tree.column('middle', width=50, anchor="center")
                tree.column('good', width=50, anchor="center")
                tree.column('super', width=50, anchor="center")
                tree.column('count', width=50, anchor="center")
                tree.heading('object', text='课程')
                tree.heading('max', text='最高分')
                tree.heading('min', text='最低分')
                tree.heading('average', text='平均分')
                tree.heading('fail', text='不及格')
                tree.heading('pass', text='及格')
                tree.heading('middle', text='中')
                tree.heading('good', text='良')
                tree.heading('super', text='优')
                tree.heading('count', text='总人数')

                Button(top,command=chart, text="柱形图", width=15).place(x=300, y=400)
                tree.place(relx=0.02, rely=0.3, relwidth=0.96)
                xs()

            Button(command=get, text="显示所有信息", width=15).place(x=750, y=200)
            Button(command=add, text="添加学生信息", width=15).place(x=750, y=250)
            Button(command=delete, text="删除学生信息", width=15).place(x=750, y=300)
            Button(command=edit, text="修改学生信息", width=15).place(x=750, y=350)
            Button(command=select, text="查询学生信息", width=15).place(x=750, y=400)
            Button(command=tj, text="统计学生信息", width=15).place(x=750, y=450)
            Button(command=qx, text="回到首页", width=15).place(x=350, y=550)
            Button(command=quit, text="退出", width=15).place(x=500, y=550)
            Button(command=qk, text="清空文本框", width=15).place(x=650, y=550)

            message = Label(text='', fg='red')
            message.place(x=100, y=550)
            columns= ("学号", "姓名", "英语", "数学", "python", "DW")
            tree = ttk.Treeview( height=15, show="headings",columns=columns)  # 隐藏首列
            tree.column("学号", width=100)  # 表示列,不显示
            tree.column("姓名", width=100)
            tree.column("英语", width=100)
            tree.column("数学", width=100)
            tree.column("python", width=100)
            tree.column("DW", width=100)


            tree.place(x=100, y=200)
            tree.heading("学号", text='学号', anchor=CENTER)
            tree.heading("姓名", text='姓名', anchor=CENTER)
            tree.heading("英语", text='英语', anchor=CENTER)
            tree.heading("数学", text='数学', anchor=CENTER)
            tree.heading("python", text='python', anchor=CENTER)
            tree.heading("DW", text='DW', anchor=CENTER)

            #点击列标签排序
            def treeview_sort_column(tv, col, reverse):  # Treeview、列名、排列方式
                l = [(tv.set(k, col), k) for k in tv.get_children('')]
                l.sort(reverse=reverse)  # 排序方式
                for index, (val, k) in enumerate(l):  # 根据排序后索引移动
                    tv.move(k, '', index)
                tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))  # 重写标题,使之成为再点倒序的标题
            for col in columns:
                tree.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tree, _col, False))
            rt1.mainloop()

    #注册模块
    def zhuce():
        rt.destroy()
        rt3 = Tk()
        rt3.title('注册用户')
        rt3.geometry('600x323+800+200')
        rt3.iconbitmap('77.ico')

        bg2 = PhotoImage(file='学生背景.gif')
        lab2 = Label(image=bg2)
        lab2.place(x=-2, y=0)

        def qx():
            rt3.destroy()
            Main()
        def jszc():
            rt3.destroy()
            rt2 = Tk()
            rt2.title('教师注册')
            rt2.geometry('600x323+800+200')
            rt2.iconbitmap('77.ico')

            Label(text='请输入姓名:').place(x=100, y=70)
            Label(text='请输入密码:').place(x=100, y=95)

            e3 = Entry(width=30)
            e3.place(x=200, y=70)
            e4 = Entry(show='*', width=30)
            e4.place(x=200, y=95)

            def zc1():

                s1 = e3.get()
                s2 = e4.get()

                if len(e3.get()) == 0 and len(e4.get()) == 0:
                    messagebox.showerror("添加失败", "姓名和密码不能为空!")
                else:
                    cursor.execute("SELECT * FROM teacher WHERE name='%s' " % (s1))
                    T = cursor.fetchone()
                    if T is None:
                        rs.LockType = 4
                        cursor.execute(
                            "INSERT INTO teacher(NAME,PASSWORD) VALUES('%s','%s')" % (s1, s2))
                        conn.commit()
                        messagebox.showinfo("提示", "添加成功!")
                    else:
                        messagebox.showerror('添加失败', '该教师已存在!')

            def zc2():
                rt2.destroy()
                Main()
            Bt1 = Button(command=zc1, text="确定", width=10)
            Bt1.place(x=200, y=120)
            Bt2 = Button(command=zc2, text="取消", width=10)
            Bt2.place(x=300, y=120)
            rt2.mainloop()
        def xszc():
            rt3.destroy()
            rt2 = Tk()
            rt2.title('学生注册')
            rt2.geometry('600x323+800+200')
            rt2.iconbitmap('77.ico')
            Label(text='请输入学号:').place(x=100, y=45)
            Label(text='请输入姓名:').place(x=100, y=70)
            Label(text='请输入密码:').place(x=100, y=95)

            e2 = Entry(width=30)
            e2.place(x=200, y=45)
            e3 = Entry(width=30)
            e3.place(x=200, y=70)
            e4 = Entry(show='*', width=30)
            e4.place(x=200, y=95)
            def zc1():
                s0 = e2.get()
                s1 = e3.get()
                s2 = e4.get()

                if len(e2.get()) == 0 and len(e3.get()) == 0 and len(e4.get()) == 0:
                    messagebox.showerror("添加失败", "学号和姓名、密码不能为空!")
                else:
                    cursor.execute("SELECT * FROM student WHERE CNO='%s' " % (s0))
                    T = cursor.fetchone()
                    if T is None:
                        rs.LockType = 4
                        cursor.execute(
                            "INSERT INTO STUDENT(CNO,CNAME,PASSWORD) VALUES('%s','%s','%s')" % (s0, s1, s2))
                        conn.commit()
                        messagebox.showinfo("提示", "添加成功!")
                    else:
                        messagebox.showerror('添加失败', '该学生已存在!')
            def zc2():
                rt2.destroy()
                Main()
            Bt1=Button(command=zc1, text="确定", width=10)
            Bt1.place(x=200, y=120)
            Bt2 = Button(command=zc2, text="取消", width=10)
            Bt2.place(x=300, y=120)
            rt2.mainloop()
        Bt1 = Button(command=xszc, text="学生注册", width=10,height=3)
        Bt1.place(x=150, y=120)
        Bt2 = Button(command=jszc, text="教师注册", width=10,height=3)
        Bt2.place(x=250, y=120)
        Bt2 = Button(command=qx, text="回到首页", width=10,height=3)
        Bt2.place(x=350, y=120)
        rt3.mainloop()
    Button(command=XSDL, text="学生登录", width=10).place(x=90, y=190)
    Button(command=JSDL, text="教师登录", width=10).place(x=190, y=190)
    Button( command=zhuce, text="用户注册", width=10).place(x=290, y=190)
    Button(command=quit, text="退出", width=10).place(x=390, y=190)
    rt.mainloop()
Main()

 

 

你可能感兴趣的:(sql,python,pycharm)