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,'uu10','123456') #打开数据库 cn.Execute("USE XSCJ") #创建表 #cn.Execute("CREATE TABLE student( cno varchar(50), cname varchar(50),password varchar(50),english int, math int, python int,java int)") #cn.Execute("CREATE TABLE teacher( name varchar(50),password varchar(50))") #建立记录集合 rs=win32com.client.Dispatch('ADODB.RecordSet') server = '127.0.0.1:1433' user ='uu10' userpassword ='123456' database = 'XSCJ' conn = pymssql.connect(server,user,userpassword,database) cursor = conn.cursor() try: cursor.execute("CREATE TABLE student( cno varchar(50), cname varchar(50),password varchar(50),english int, math int, python int,java int)") cursor.execute("CREATE TABLE teacher( name varchar(50),password varchar(50))") except pymssql.OperationalError: pass #else: # cursor.execute("CREATE TABLE student( cno varchar(50), cname varchar(50),password varchar(50),english int, math int, python int,java int)") # cursor.execute("CREATE TABLE teacher( name varchar(50),password varchar(50))") 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", "java") 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("java", 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("java", text='java', 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,java 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)) try: conn.commit() except pymssql.OperationalError: pass 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='java:',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,java 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 or 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,java) VALUES('%s','%s','%s','%s','%s','%s')" %(s3, s4, s5, s6, s7, s8)) try: conn.commit() except pymssql.OperationalError: pass messagebox.showinfo("提示", "添加成功!") tree.insert("", 0, values=(s3, s4, s5, s6, s7, s8)) get() 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)) try: conn.commit() except pymssql.OperationalError: pass #showinfo(message="删除成功") 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_java = 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=1, column=1) #new_cno = Entry(edit_win, textvariable=StringVar(edit_win, value=old_cno)) #new_cno.grid(row=1, 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='原来java成绩').grid(row=10, column=1) Entry(edit_win, textvariable=StringVar(edit_win, value=old_java), state='readonly').grid( row=10, column=2) Label(edit_win, text='新的java成绩').grid(row=11, column=1) new_java = Entry(edit_win, textvariable=StringVar(edit_win, value=old_java)) new_java.grid(row=11, column=2) # 数据修改处理 def edit_record(): #s2 = new_cno.get() s3 = new_name.get() s4 = new_english.get() s5 = new_math.get() s6 = new_python.get() s7 = new_java.get() rs.LockType = 4 cursor.execute("update student set cname=%s,english=%s,math=%s,python=%s,java=%s where cno=%s ",(s3,s4,s5,s6,s7,old_cno)) try: conn.commit() except pymssql.OperationalError: pass 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", "java") 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("java", 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("java", text='java', 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,java 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,java 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(java), min(java), round(avg(java),1),COUNT (case when java between 0 and 59 then 1 end),COUNT (case when java between 60 and 69 then 1 end),COUNT (case when java between 70 and 79 then 1 end),COUNT (case when java between 80 and 89 then 1 end),COUNT (case when java between 90 and 100 then 1 end), count(*) from student") S4 = cursor.fetchall() S4 = ("java",) + 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="java", 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", "java") 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("java", 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("java", text='java', 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)) try: conn.commit() except pymssql.OperationalError: pass 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)) try: conn.commit() except pymssql.OperationalError: pass 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=100, y=190) Button(command=JSDL, text="教师登录", width=10).place(x=250, y=190) Button(command=zhuce, text="用户注册", width=10).place(x=400, y=190) # Button(command=quit, text="退出", width=10).place(x=390, y=190) rt.mainloop() Main()