参考了大佬的,把mysql数据库改成了sqlserver
附上大佬的代码链接
程序我都写到了一个.py文件中,之前做的课程作业,现在看起来有点凌乱,
需要先在sqlserver中新建一个XSCJ数据库,里面有两张表,一个student表,一个teacher表
创建表的语句在程序的开头,我注释掉了,先取消掉那个注释,创建完再注释掉就可以了
前两张图片是背景图片,必须用gif格式的(我也不知为什么),还有一个图标ico格式的,网上随便找一个
这是主界面,可以注册和选择角色登录
学生的功能仅有查询自己的成绩和修改密码,老师拥有所有权限
学生的功能就不演示了,直接上教师的功能。
一、这是显示所有学生信息
二、添加学生信息直接输入在上面的文本框,点击添加就可以了
三、删除学生信息,选中表格中的数据,点删除即可,
四、修改学生信息
五、查询学生信息,可用两种查询方式,学号和姓名都可单独查询
六、统计学生信息,可现实最高分、最低分、平均分、及格等的统计
点击柱形图即可统计
我的源代码如下,执行如果出错请先检查数据库,图片要和源程序放在同一路径下
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,