目录
本文主要利用PyMySQL和Tkinter实现简易版的学生信息管理系统,其功能包括管理员登录、学生登录、学生信息修改,学生信息查看等;系统数据库为MySQL;
1 PyMySQL的安装和使用
什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
在使用PyMySQL之前,我们可以通过以下命令来安装:
pip install PyMySQL
下面用一个简单的例子来介绍PyMySQL的使用方法:
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='testuser',
password='test123',
database='TESTDB')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 关闭数据库连接
db.close()
在上面的代码中,我们使用 pymysql.connect() 方法连接到了 MySQL 数据库,并传入了连接所需的参数。其中,host 是数据库主机地址,user 是数据库用户名,password 是数据库密码,database 是要连接的数据库名称。我们首先利用db.cursor()创建了一个游标对象,然后使用 execute()方法执行了一个 SELECT 查询,并使用 fetchone()方法获取查询结果。最后通过close()方法关闭连接。
2 学生信息管理系统实现
2.1 导入依赖
import pymysql
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import * # 图形界面库
import tkinter.messagebox as messagebox # 弹窗
2.2 定义首页
class StartPage:
def __init__(self, parent_window):
parent_window.update()
parent_window.destroy() # 销毁子界面
self.window = tk.Tk() # 初始框的声明
self.window.title('学生信息管理系统')
self.window.geometry('300x470') # 这里的乘是小x
label = Label(self.window, text="学生信息管理系统", font=("Verdana", 20))
label.pack(pady=100) # pady=100 界面的长度
Button(self.window, text="管理员登陆", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window),
width=30,
height=2,
fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
Button(self.window, text="学生登陆", font=tkFont.Font(size=16), command=lambda: StudentPage(self.window),
width=30,
height=2, fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
Button(self.window, text="关于", font=tkFont.Font(size=16), command=lambda: AboutPage(self.window), width=30,
height=2,
fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
Button(self.window, text='退出系统', height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy,
fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
self.window.mainloop() # 主消息循环
这段Python代码定义了一个名为StartPage
的类,用于创建一个包含标题、登录按钮和关于按钮的简单界面。当用户点击“管理员登录”或“学生登录”按钮时,将打开相应的子界面(AdminPage
或StudentPage
)。点击“关于”按钮将打开另一个子界面(AboutPage
)。点击“退出系统”按钮将关闭界面。
2.3 管理员登陆页面
class AdminPage:
def __init__(self, parent_window):
parent_window.update()
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('管理员登陆页面')
self.window.geometry('300x450') # 这里的乘是小x
label = tk.Label(self.window, text='管理员登陆', bg='green', font=('Verdana', 20), width=30, height=2)
label.pack()
Label(self.window, text='管理员账号:', font=tkFont.Font(size=14)).pack(pady=25)
self.admin_username = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory')
self.admin_username.pack()
Label(self.window, text='管理员密码:', font=tkFont.Font(size=14)).pack(pady=25)
self.admin_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*')
self.admin_pass.pack()
Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack()
self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击
self.window.mainloop() # 进入消息循环
def login(self):
print(str(self.admin_username.get()))
print(str(self.admin_pass.get()))
admin_pass = None
# 数据库操作 查询管理员表
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main',
charset='utf8') # 打开数据库连接
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "SELECT * FROM admin_login_k WHERE admin_id = '%s'" % (self.admin_username.get()) # SQL 查询语句
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
admin_id = row[0]
admin_pass = row[1]
# 打印结果
print("admin_id=%s,admin_pass=%s" % (admin_id, admin_pass))
except:
print("Error: unable to fecth data")
messagebox.showinfo('警告!', '用户名或密码不正确!')
db.close() # 关闭数据库连接
print("正在登陆管理员管理界面")
print("self", self.admin_pass)
print("local", admin_pass)
if self.admin_pass.get() == admin_pass:
AdminManage(self.window) # 进入管理员操作界面
else:
messagebox.showinfo('警告!', '用户名或密码不正确!')
def back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
这段Python代码定义了一个名为AdminPage
的类,用于创建一个管理员登录界面。当用户点击“登录”按钮时,它会检查用户输入的管理员用户名和密码是否与数据库中的记录匹配。如果匹配成功,它会显示一个管理员管理界面;否则,它会弹出一个警告框提示用户。
2.4 学生登陆页面
class StudentPage:
def __init__(self, parent_window):
parent_window.update()
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('学生登陆')
self.window.geometry('300x450') # 这里的乘是小x
label = tk.Label(self.window, text='学生登陆', bg='green', font=('Verdana', 20), width=30, height=2)
label.pack()
Label(self.window, text='学生账号:', font=tkFont.Font(size=14)).pack(pady=25)
self.student_id = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory')
self.student_id.pack()
Label(self.window, text='学生密码:', font=tkFont.Font(size=14)).pack(pady=25)
self.student_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*')
self.student_pass.pack()
Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack()
self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击
self.window.mainloop() # 进入消息循环
def login(self):
print(str(self.student_id.get()))
print(str(self.student_pass.get()))
stu_pass = None
# 数据库操作 查询管理员表
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main',
charset='utf8') # 打开数据库连接
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "SELECT * FROM stu_login_k WHERE stu_id = '%s'" % (self.student_id.get()) # SQL 查询语句
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
stu_id = row[0]
stu_pass = row[1]
# 打印结果
print("stu_id=%s,stu_pass=%s" % (stu_id, stu_pass))
except:
print("Error: unable to fecth data")
messagebox.showinfo('警告!', '用户名或密码不正确!')
db.close() # 关闭数据库连接
print("正在登陆学生信息查看界面")
print("self", self.student_pass.get())
print("local", stu_pass)
if self.student_pass.get() == stu_pass:
StudentView(self.window, self.student_id.get()) # 进入学生信息查看界面
else:
messagebox.showinfo('警告!', '用户名或密码不正确!')
def back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
这段Python代码定义了一个名为StudentPage
的类,用于实现一个简单的的学生登录界面。当用户点击“登录”按钮时,它会检查用户输入的学号和密码是否与数据库中存储的匹配。如果匹配成功,它会显示一个学生信息查看界面;否则,它会弹出一个警告框提示用户输入错误。
2.5 管理员操作界面
class AdminManage:
def __init__(self, parent_window):
parent_window.update()
parent_window.destroy() # 销毁主界面
self.window = Tk() # 初始框的声明
self.window.title('管理员操作界面')
self.frame_left_top = tk.Frame(width=300, height=320)
self.frame_right_top = tk.Frame(width=200, height=200)
self.frame_center = tk.Frame(width=500, height=400)
self.frame_bottom = tk.Frame(width=650, height=50)
# 定义下方中心列表区域
self.columns = ("学号", "姓名", "性别", "年龄", "English", "Java", "Python", "Score")
self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns)
self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
# 定义树形结构与滚动条
self.tree.configure(yscrollcommand=self.vbar.set)
# 表格的标题
self.tree.column("学号", width=100, anchor='center') # 表示列,不显示
self.tree.column("姓名", width=50, anchor='center')
self.tree.column("性别", width=50, anchor='center')
self.tree.column("年龄", width=50, anchor='center')
self.tree.column("English", width=50, anchor='center')
self.tree.column("Java", width=50, anchor='center')
self.tree.column("Python", width=50, anchor='center')
self.tree.column("Score", width=50, anchor='center')
# 调用方法获取表格内容插入
self.tree.grid(row=0, column=0, sticky=NSEW)
self.vbar.grid(row=0, column=1, sticky=NS)
self.id = []
self.name = []
self.gender = []
self.age = []
self.english = []
self.java = []
self.python = []
self.score = []
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main', charset='utf8')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "SELECT * FROM student_k" # SQL 查询语句
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
self.id.append(row[0])
self.name.append(row[1])
self.gender.append(row[2])
self.age.append(row[3])
self.english.append(row[4])
self.java.append(row[5])
self.python.append(row[6])
self.score.append(row[7])
# print(self.id)
# print(self.name)
# print(self.gender)
# print(self.age)
except:
print("Error: unable to fetch data")
messagebox.showinfo('警告!', '数据库连接失败!')
db.close() # 关闭数据库连接
print("test***********************")
for i in range(
min(len(self.id), len(self.name), len(self.gender), len(self.age), len(self.english), len(self.java),
len(self.python), len(self.score))): # 写入数据
self.tree.insert('', i, values=(
self.id[i], self.name[i], self.gender[i], self.age[i], self.english[i], self.java[i], self.python[i],
self.score[i]))
for col in self.columns: # 绑定函数,使表头可排序
self.tree.heading(col, text=col,
command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))
# 定义顶部区域
# 定义左上方区域
self.top_title = Label(self.frame_left_top, text="学生信息:", font=('Verdana', 20))
self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10)
self.left_top_frame = tk.Frame(self.frame_left_top)
self.var_id = StringVar() # 声明学号
self.var_name = StringVar() # 声明姓名
self.var_gender = StringVar() # 声明性别
self.var_age = StringVar() # 声明年龄
self.var_english = StringVar()
self.var_java = StringVar()
self.var_python = StringVar()
self.var_score = StringVar()
# 学号
self.right_top_id_label = Label(self.frame_left_top, text="学号:", font=('Verdana', 15))
self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15))
self.right_top_id_label.grid(row=1, column=0) # 位置设置
self.right_top_id_entry.grid(row=1, column=1)
# 姓名
self.right_top_name_label = Label(self.frame_left_top, text="姓名:", font=('Verdana', 15))
self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15))
self.right_top_name_label.grid(row=2, column=0) # 位置设置
self.right_top_name_entry.grid(row=2, column=1)
# 性别
self.right_top_gender_label = Label(self.frame_left_top, text="性别:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=3, column=0) # 位置设置
self.right_top_gender_entry.grid(row=3, column=1)
# 年龄
self.right_top_gender_label = Label(self.frame_left_top, text="年龄:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=4, column=0) # 位置设置
self.right_top_gender_entry.grid(row=4, column=1)
# english
self.right_top_gender_label = Label(self.frame_left_top, text="English:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_english,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=5, column=0) # 位置设置
self.right_top_gender_entry.grid(row=5, column=1)
# java
self.right_top_gender_label = Label(self.frame_left_top, text="Java:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_java,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=6, column=0) # 位置设置
self.right_top_gender_entry.grid(row=6, column=1)
# python
self.right_top_gender_label = Label(self.frame_left_top, text="Python:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_python,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=7, column=0) # 位置设置
self.right_top_gender_entry.grid(row=7, column=1)
self.right_top_gender_label = Label(self.frame_left_top, text="总分:", font=('Verdana', 15))
self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_score,
font=('Verdana', 15))
self.right_top_gender_label.grid(row=8, column=0) # 位置设置
self.right_top_gender_entry.grid(row=8, column=1)
# 定义右上方区域
self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20))
self.tree.bind('<Button-1>', self.click) # 左键获取位置
self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建学生信息', width=20, command=self.new_row)
self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中学生信息', width=20,
command=self.updata_row)
self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中学生信息', width=20,
command=self.del_row)
# 位置设置
self.right_top_title.grid(row=1, column=0, pady=10)
self.right_top_button1.grid(row=2, column=0, padx=20, pady=10)
self.right_top_button2.grid(row=3, column=0, padx=20, pady=10)
self.right_top_button3.grid(row=4, column=0, padx=20, pady=10)
# 整体区域定位
self.frame_left_top.grid(row=0, column=0, padx=2, pady=5)
self.frame_right_top.grid(row=0, column=1, padx=30, pady=30)
self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5)
self.frame_bottom.grid(row=2, column=0, columnspan=2)
self.frame_left_top.grid_propagate(0)
self.frame_right_top.grid_propagate(0)
self.frame_center.grid_propagate(0)
self.frame_bottom.grid_propagate(0)
self.frame_left_top.tkraise() # 开始显示主菜单
self.frame_right_top.tkraise() # 开始显示主菜单
self.frame_center.tkraise() # 开始显示主菜单
self.frame_bottom.tkraise() # 开始显示主菜单
self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击
self.window.mainloop() # 进入消息循环
def back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
def click(self, event):
self.col = self.tree.identify_column(event.x) # 列
self.row = self.tree.identify_row(event.y) # 行
print(self.col, self.row)
# print(self.row)
self.row_info = self.tree.item(self.row, "values")
self.var_id.set(self.row_info[0])
self.var_name.set(self.row_info[1])
self.var_gender.set(self.row_info[2])
self.var_age.set(self.row_info[3])
self.var_english.set(self.row_info[4])
self.var_java.set(self.row_info[5])
self.var_python.set(self.row_info[6])
self.var_score.set(self.row_info[7])
self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id,
font=('Verdana', 15))
print('')
def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式
l = [(tv.set(k, col), k) for k in tv.get_children('')]
l.sort(reverse=reverse) # 排序方式
# rearrange items in sorted positions
for index, (val, k) in enumerate(l): # 根据排序后索引移动
tv.move(k, '', index)
tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题
def new_row(self):
print('123')
print(self.var_id.get())
print(self.id)
if str(self.var_id.get()) in self.id:
messagebox.showinfo('警告!', '该学生已存在!')
else:
if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '' \
and self.var_english.get() != '' and self.var_java.get() != '' and self.var_python.get() != '' and self.var_score.get() != '':
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main',
charset='utf8')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "INSERT INTO student_k(id, name, gender, age, english, java, python, Score) \
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % \
(self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(),
self.var_english.get(), self.var_java.get(), self.var_python.get(),
self.var_score.get()) # SQL 插入语句
try:
cursor.execute(sql) # 执行sql语句
db.commit() # 提交到数据库执行
except:
db.rollback() # 发生错误时回滚
messagebox.showinfo('警告!', '数据库连接失败!')
db.close() # 关闭数据库连接
self.id.append(self.var_id.get())
self.name.append(self.var_name.get())
self.gender.append(self.var_gender.get())
self.age.append(self.var_age.get())
self.english.append(self.var_english.get())
self.java.append(self.var_java.get())
self.python.append(self.var_python.get())
self.score.append(self.var_score)
self.tree.insert('', len(self.id) - 1, values=(
self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1],
self.age[len(self.id) - 1], self.english[len(self.id) - 1], self.java[len(self.id) - 1],
self.python[len(self.id) - 1], self.score[len(self.id) - 1]))
self.tree.update()
messagebox.showinfo('提示!', '插入成功!')
else:
messagebox.showinfo('警告!', '请填写学生数据')
def updata_row(self):
res = messagebox.askyesnocancel('提示!', '是否更新所填数据?')
if res == True:
if self.var_id.get() == self.row_info[0]: # 如果所填学号 与 所选学号一致
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main',
charset='utf8')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "UPDATE student_k SET name = '%s', gender = '%s', age = '%s', english = '%s', java = '%s', " \
"python = '%s', Score = '%s' WHERE id = '%s'" % (
self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_english.get(),
self.var_java.get(), self.var_python.get(), self.var_score.get(),
self.var_id.get()) # SQL 插入语句
try:
cursor.execute(sql) # 执行sql语句
db.commit() # 提交到数据库执行
messagebox.showinfo('提示!', '更新成功!')
except:
db.rollback() # 发生错误时回滚
messagebox.showinfo('警告!', '更新失败,数据库连接失败!')
db.close() # 关闭数据库连接
id_index = self.id.index(self.row_info[0])
self.name[id_index] = self.var_name.get()
self.gender[id_index] = self.var_gender.get()
self.age[id_index] = self.var_age.get()
self.english[id_index] = self.var_english.get()
self.java[id_index] = self.var_java.get()
self.python[id_index] = self.var_python.get()
self.score[id_index] = self.var_score.get()
self.tree.item(self.tree.selection()[0], values=(
self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(),
self.var_english.get(), self.var_java.get(), self.var_python.get(),
self.var_score.get())) # 修改对于行信息
else:
messagebox.showinfo('警告!', '不能修改学生学号!')
def del_row(self):
res = messagebox.askyesnocancel('提示!', '是否删除所选数据?')
if res == True:
print(self.row_info[0]) # 鼠标选中的学号
print(self.tree.selection()[0]) # 行号
print(self.tree.get_children()) # 所有行
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main', charset='utf8')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "DELETE FROM student_k WHERE id = '%s'" % (self.row_info[0]) # SQL 插入语句
try:
cursor.execute(sql) # 执行sql语句
db.commit() # 提交到数据库执行
messagebox.showinfo('提示!', '删除成功!')
except:
db.rollback() # 发生错误时回滚
messagebox.showinfo('警告!', '删除失败,数据库连接失败!')
db.close() # 关闭数据库连接
id_index = self.id.index(self.row_info[0])
print(id_index)
del self.id[id_index]
del self.name[id_index]
del self.gender[id_index]
del self.age[id_index]
del self.english[id_index]
del self.java[id_index]
del self.python[id_index]
del self.score[id_index]
print(self.id)
self.tree.delete(self.tree.selection()[0]) # 删除所选行
print(self.tree.get_children())
这段代码定义了一个名为AdminManage
的类,用于管理一个管理员操作界面。这个界面包括一个表格显示学生信息,以及一些操作按钮(新建学生信息、更新学生信息、删除学生信息)。
2.6 学生查看信息界面
class StudentView:
def __init__(self, parent_window, student_id):
parent_window.update()
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('关于')
self.window.geometry('300x550') # 这里的乘是小x
label = tk.Label(self.window, text='学生信息查看', bg='pink', font=('Verdana', 20), width=30, height=2)
label.pack(pady=20)
self.id = '学号:' + ''
self.name = '姓名:' + ''
self.gender = '性别:' + ''
self.age = '年龄:' + ''
self.english = '英语:' + ''
self.java = 'Java:' + ''
self.python = 'Python:' + ''
self.score = '总分:' + ''
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main', charset='utf8')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "SELECT * FROM student_k WHERE id = '%s'" % (student_id) # SQL 查询语句
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
# print(results)
for row in results:
self.id = '学号:' + row[0]
self.name = '姓名:' + row[1]
self.gender = '性别:' + row[2]
self.age = '年龄:' + row[3]
self.english = '英语:' + row[4]
self.java = 'Java:' + row[5]
self.python = 'Python:' + row[6]
self.score = '总分:' + row[7]
# print(self.id)
# print(self.name)
# print(self.gender)
# print(self.age)
except:
print("Error: unable to fetch data")
db.close() # 关闭数据库连接
Label(self.window, text=self.id, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.name, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.gender, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.age, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.english, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.java, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.python, font=('Verdana', 18)).pack(pady=5)
Label(self.window, text=self.score, font=('Verdana', 18)).pack(pady=5)
Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=16), command=self.back).pack(pady=25)
self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击
self.window.mainloop() # 进入消息循环
def back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
这段Python代码定义了一个名为StudentView
的类,用于显示一个包含学生信息的窗口。当用户点击“查看学生信息”按钮时,它会创建一个新的窗口,显示与指定学生ID相关的信息。
3 源码下载
【免费】Tkinter简易版学生信息管理系统源码+数据库配置文件资源-CSDN文库
注意:下载源码过后,请做以下更改
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='20010219', db='main', charset='utf8')
请将这段源码中的user和passwd更改为自己的数据库账号和密码,代码中有几个这样的代码,请逐一修改。