“关键字查询”功能怎么写?

用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()

希望这个简单的示例对您有所帮助!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7543831
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【Python网络爬虫整理记录 D:05】——在pycharm中连接MySQL数据库以及爬虫pymysql库的使用将数据存储至MySQL数据库
  • 除此之外, 这篇博客: 学习Pycharm连接Mysql数据库心得(附可能出现的问题及解决方法)中的 7.点击红圈中的小图标,可以进入命令窗口,输入sql语句,进行命令行操作,而且有关键字提示, 字段提示以及数据表提示,可以批量处理也可以单行运行,操作非常方便 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述

  • 以下回答来自chatgpt:

    首先,为了实现关键字查询功能,需要在已有的MySQL数据库中创建表,并在其中插入数据。可以参考参考资料中的段落0和段落1,使用Python和PyMySQL库操作MySQL数据库。具体步骤如下:

    1. 创建一个名为keywords的表,包含两列:idkeyword(关键字)。
    # 创建名为keywords的表
    CREATE TABLE keywords (
      id INT NOT NULL AUTO_INCREMENT,
      keyword VARCHAR(255) NOT NULL,
      PRIMARY KEY (id)
    );
    
    1. 插入一些数据,用于演示关键字查询的效果。
    # 插入数据
    INSERT INTO keywords (keyword) VALUES ('Python'), ('Java'), ('C++'), ('JavaScript'), ('PHP');
    

    接下来,编写Python代码实现关键字查询功能。具体步骤如下:

    1. 在PyCharm中创建一个新的Python文件,并导入需要用到的库。具体导入方式如下:
    import pymysql
    import tkinter as tk
    
    1. 创建一个MySQL连接,并获取游标。具体代码如下:
    db = pymysql.connect(host='localhost', user='root', password='password', database='test')
    cursor = db.cursor()
    

    注意:需要将上面的hostuserpassword等参数替换为你的实际MySQL连接信息。

    1. 定义一个查询函数,用于根据关键字查询数据并在Tkinter窗口中展示查询结果。
    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运算符,查询结果包含符合关键字的所有数据。在实际的系统中,可以根据需求修改查询语句。

    1. 创建一个Tkinter窗口,并添加一个文本框用于输入关键字,一个按钮用于触发查询操作,以及一个列表框用于展示查询结果。具体代码如下:
    # 创建一个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()
    
    1. 最后,记得在程序结束后关闭MySQL连接。
    # 关闭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()
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^