用pycharm,tkinter,mysql写一个管理系统,想尝试增加一个“关键字查询”的功能,是仿照其他模块写出来的,改来改去总是各种报错,附上“关键字查询”这个功能的相关代码,烦请指正。
class SearchPage:
def __init__(self, parent_window):
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('关键字查询页面')
self.window.geometry('540x666')
self.window['bg'] = 'limegreen'
self.shared_var = tk.StringVar() # 创建共享变量
self.shared_var.set("") # 初始化共享变量为默认值
label = tk.Label(self.window, text='关键字查询', bg='forestgreen', fg='white', font=('Verdana', 20), width=32,
height=2)
label.pack()
Label(self.window, text='输入关键字:', font=tkFont.Font(size=14)).pack(pady=25)
self.keyword = tk.Entry(self.window, width=30, font=tkFont.Font(size=18), bg='Ivory', textvariable=self.shared_var)
self.keyword.pack()
Button(self.window, text="查询", width=8, font=tkFont.Font(size=12), command=lambda: Result(self.window, self.shared_var)).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 back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
def show_result(self):
keyword = self.shared_var.get() # 获取关键字
# 使用关键字查询结果并显示
Result(self.window, keyword)
class Result:
def __init__(self, parent_window, keyword):
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('查询相关信息页面')
self.window.geometry('540x666') # 这里的乘是小x
self.window['bg'] = 'limegreen'
label = tk.Label(self.window, text='查询相关信息', bg='forestgreen', fg='white', font=('Verdana', 20), width=32,
height=2)
label.pack()
self.frame_center = tk.Frame(width=500, height=380, bg='indigo')
self.columns = ("学号", "姓名", "性别", "年龄", "系别", '专业', '课程名', '学分', '成绩') # y:定义下方中心列表区域,并添加滚动条。使用ttk.Treeview()创建表格,具体的参数设置为width表示表格宽度,height表示表格高度,columns表示表格的列名称。
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) #:定义表格的列和表格内容,并设置显示的位置、宽度和对齐方式,并使用configure()方法可以对树形控件进行各种配置。在本代码中,使用yscrollcommand参数来绑定垂直滚动条。
self.tree.column("学号", width=150, anchor='center') # 表示列,不显示
self.tree.column("姓名", width=150, anchor='center')
self.tree.column("性别", width=100, anchor='center')
self.tree.column("年龄", width=100, anchor='center')
self.tree.column("系别", width=100, anchor='center')
self.tree.column("专业", width=100, anchor='center')
self.tree.column("课程名", width=100, anchor='center')
self.tree.column("学分", width=100, anchor='center')
self.tree.column("成绩", width=100, 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.dep = []
self.major = []
self.cname = []
self.credit = []
self.grade = []
db = pymysql.connect(host='localhost', port=3306, db='student', user='root', password='147159123y')
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = f"SELECT a.id, a.name, a.gender, a.age, a.dep, a.major, b.cname, b.credit, c.grade \
FROM student a, course b, score c \
WHERE a.id = b.id AND b.cno = c.cno AND (a.id LIKE '%{keyword}%' OR a.name LIKE '%{keyword}%' OR a.gender LIKE '%{keyword}%' \
OR a.age LIKE '%{keyword}%' OR a.dep LIKE '%{keyword}%' OR a.major LIKE '%{keyword}%' OR b.cname LIKE '%{keyword}%' OR b.credit LIKE '%{keyword}%' \
OR c.grade LIKE '%{keyword}%')"
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.dep.append(row[4])
self.major.append(row[5])
self.cname.append(row[6])
self.credit.append(row[7])
self.grade.append(row[8])
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.dep), len(self.major), len(self.cname), len(self.credit), len(self.grade))): # 写入数据
self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i],
self.dep[i], self.major[i], self.cname[i], self.credit[i], self.grade[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.frame_center.tkraise() # 开始显示主菜单
def back(self):
StartPage(self.window) # 显示主窗口 销毁本窗口
def click(self, event): # y:这段代码实现了对学生信息表格的左键点击事件进行响应,功能如下:
self.col = self.tree.identify_column(event.x) # 列 y:self.col = self.tree.identify_column(event.x)获得鼠标点击位置所在的列。
self.row = self.tree.identify_row(event.y) # 行 同上
print(self.col)
print(self.row)
self.row_info = self.tree.item(self.row, "values")
self.var_id.set(self.row_info[0]) # y: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_dep.set(self.row_info[4]) # y:self.var_id.set(self.row_info[0])将学号、姓名、性别、年龄分别赋值给四个文本框。
self.var_major.set(self.row_info[5])
self.var_cname.set(self.row_info[6])
self.var_credit.set(self.row_info[7])
self.var_grade.set(self.row_info[8])
print('')
def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 y:tv参数为表格、col参数为排序的列名,reverse参数用于指定排序方式,其中True表示降序,False表示升序。
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)) # 重写标题,使之成为再点倒序的标题 y:tv.heading()调用该列的标题,改变命令绑定。当用户再次点击时,将指示列的升序或降序。
你代码太乱了,给你写个规范的,自己对照
完整代码如下:
import tkinter as tk
import mysql.connector
cnx = mysql.connector.connect(user="your_username", password="your_password", database="management_system")
cursor = cnx.cursor()
def add_record(name, age):
"""添加记录"""
add_query = "INSERT INTO student (name, age) VALUES (%s, %s)"
record = (name, age)
cursor.execute(add_query, record)
cnx.commit()
def modify_record(name, age):
"""修改记录"""
modify_query = "UPDATE student SET age = %s WHERE name = %s"
record = (age, name)
cursor.execute(modify_query, record)
cnx.commit()
def delete_record(name):
"""删除记录"""
delete_query = "DELETE FROM student WHERE name = %s"
cursor.execute(delete_query, (name,))
cnx.commit()
def search_record(keyword):
"""关键字查询"""
search_query = "SELECT * FROM student WHERE name LIKE %s"
cursor.execute(search_query, (f"%{keyword}%",))
result = cursor.fetchall()
return result
def add_record_clicked():
name = entry_name.get()
age = int(entry_age.get())
add_record(name, age)
def modify_record_clicked():
name = entry_name.get()
age = int(entry_age.get())
modify_record(name, age)
def delete_record_clicked():
name = entry_name.get()
delete_record(name)
def search_record_clicked():
keyword = entry_name.get()
result = search_record(keyword)
for widget in frame_result.winfo_children():
widget.destroy()
for r, row in enumerate(result):
for c, cell in enumerate(row):
label_cell = tk.Label(frame_result, text=cell)
label_cell.grid(row=r, column=c)
window = tk.Tk()
window.title("管理系统")
label_name = tk.Label(window, text="姓名:")
label_name.grid(row=0, column=0)
entry_name = tk.Entry(window)
entry_name.grid(row=0, column=1)
label_age = tk.Label(window, text="年龄:")
label_age.grid(row=1, column=0)
entry_age = tk.Entry(window)
entry_age.grid(row=1, column=1)
btn_add = tk.Button(window, text="添加记录")
btn_add.grid(row=2, column=0)
btn_modify = tk.Button(window, text="修改记录")
btn_modify.grid(row=2, column=1)
btn_delete = tk.Button(window, text="删除记录")
btn_delete.grid(row=2, column=2)
btn_search = tk.Button(window, text="查询记录")
btn_search.grid(row=3, column=1)
frame_result = tk.Frame(window)
frame_result.grid(row=4, column=0, columnspan=3)
btn_add.config(command=add_record_clicked)
btn_modify.config(command=modify_record_clicked)
btn_delete.config(command=delete_record_clicked)
btn_search.config(command=search_record_clicked)
window.mainloop()
希望这个简单的示例对您有所帮助!
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,为了实现关键字查询功能,需要在已有的MySQL数据库中创建表,并在其中插入数据。可以参考参考资料中的段落0和段落1,使用Python和PyMySQL库操作MySQL数据库。具体步骤如下:
keywords
的表,包含两列:id
和keyword
(关键字)。# 创建名为keywords的表
CREATE TABLE keywords (
id INT NOT NULL AUTO_INCREMENT,
keyword VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
# 插入数据
INSERT INTO keywords (keyword) VALUES ('Python'), ('Java'), ('C++'), ('JavaScript'), ('PHP');
接下来,编写Python代码实现关键字查询功能。具体步骤如下:
import pymysql
import tkinter as tk
db = pymysql.connect(host='localhost', user='root', password='password', database='test')
cursor = db.cursor()
注意:需要将上面的host
、user
、password
等参数替换为你的实际MySQL连接信息。
def query_keyword():
# 获取用户输入的关键字
keyword = entry.get()
# 构建查询语句
sql = "SELECT * FROM keywords WHERE keyword like '%{}%'".format(keyword)
# 执行查询语句并获取结果
cursor.execute(sql)
results = cursor.fetchall()
# 在列表框中展示查询结果
listbox.delete(0, tk.END)
for row in results:
listbox.insert(tk.END, row[1])
注意:上面的关键字查询语句为模糊查询,使用了like
运算符,查询结果包含符合关键字的所有数据。在实际的系统中,可以根据需求修改查询语句。
# 创建一个Tkinter窗口
window = tk.Tk()
window.title("关键字查询")
window.geometry("300x200")
# 创建一个文本框用于输入关键字
entry = tk.Entry(window)
entry.pack()
# 创建一个按钮用于触发查询操作
button = tk.Button(window, text="查询", command=query_keyword)
button.pack()
# 创建一个列表框用于展示查询结果
listbox = tk.Listbox(window)
listbox.pack()
# 显示窗口并进入主事件循环
window.mainloop()
# 关闭MySQL连接
cursor.close()
db.close()
这样,关键字查询功能就实现了。完整代码如下:
import pymysql
import tkinter as tk
# 创建一个MySQL连接,并获取游标
db = pymysql.connect(host='localhost', user='root', password='password', database='test')
cursor = db.cursor()
# 定义一个查询函数
def query_keyword():
# 获取用户输入的关键字
keyword = entry.get()
# 构建查询语句
sql = "SELECT * FROM keywords WHERE keyword like '%{}%'".format(keyword)
# 执行查询语句并获取结果
cursor.execute(sql)
results = cursor.fetchall()
# 在列表框中展示查询结果
listbox.delete(0, tk.END)
for row in results:
listbox.insert(tk.END, row[1])
# 创建一个Tkinter窗口
window = tk.Tk()
window.title("关键字查询")
window.geometry("300x200")
# 创建一个文本框用于输入关键字
entry = tk.Entry(window)
entry.pack()
# 创建一个按钮用于触发查询操作
button = tk.Button(window, text="查询", command=query_keyword)
button.pack()
# 创建一个列表框用于展示查询结果
listbox = tk.Listbox(window)
listbox.pack()
# 显示窗口并进入主事件循环
window.mainloop()
# 关闭MySQL连接
cursor.close()
db.close()