首页 > 解决方案 > SQL 查询中 OptionMenu 中的选项重复

问题描述

我正在尝试创建一个 tk.OptionMenu,它将 SQL 搜索查询的结果作为选项存储在其菜单中,但是当用户重新进入页面时,会出现一组与第一个相同的选项。

我创建了示例代码:

Attendance.grid(row=0,column=0,sticky="nsew")
Menu=tk.Frame(root)
Menu.grid(row=0,column=0,sticky="nsew")
EventList=[]
# Connect MySQL
mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="#####",
    database="scoutsdatabase"
)
#Outputs Connection Object
print(mydb)
mycursor = mydb.cursor()
def CheckAttendance():
    return
#Define Trace Var
AttendanceEvent = tk.StringVar()
AttendanceEvent.trace("w", CheckAttendance)

def AttendanceRaiseFrame():
    mycursor.execute("SELECT eventname FROM events")
    myresults = mycursor.fetchall()
    if len(myresults)==0:
        tk.messagebox.showinfo("No Events","You Have Not Created Any Events to Take Attendance From.")
        return
    for i in myresults:
        EventList.append(i)

    AttendanceOptionMenu = tk.OptionMenu(Attendance, AttendanceEvent, *EventList)
    AttendanceOptionMenu.grid(row=2, column=2)
    Attendance.tkraise()
    return
def Back():
    Menu.tkraise()

StartButton=tk.Button(Menu,text="Start",command=AttendanceRaiseFrame)
StartButton.grid(row=1,column=0)
BackButton=tk.Button(Attendance,text="Back",command=Back)
BackButton.grid(row=2,column=0)
Menu.tkraise()
root.mainloop()

这是一个发生的例子。

用户启动程序并看到这个界面:

1

用户按下“开始”按钮,移动框架:

2

请参阅选项菜单中的可用选项。

3

用户按“返回”,返回原帧

4

用户按下“开始”,查看选项菜单中可用的选项

5

此外,如果它们是对 eventname 列的附加或删除,我希望更改反映在选项菜单中。

例如,我删除“露营”。我应该在我的选项菜单中留下打结、博尔德之旅、跋涉轨道。

如果您需要查看我的数据库或表格,请询问。提前致谢!

PS:不知道为什么 {} 包含除第一个选项之外的每个选项。这不是故意的。

标签: pythonpython-3.xtkinter

解决方案


您将查询结果附加到EventList,但EventList已包含先前执行查询的结果。

EventList一个简单的解决方案是在附加新查询结果之前清除。

EventList.clear()
for i in myresults:
    EventList.append(i)

事实上,正如 Martineau 所观察到的,问题的根本原因在于它EventList是一个全局变量,即它是在顶层代码中定义的。它只在AttendanceRaiseFrame函数内部使用,因此更好的解决方案是将顶级EventList = []声明移动到函数内部:

def AttendanceRaiseFrame():
    mycursor.execute("SELECT eventname FROM events")
    myresults = mycursor.fetchall()
    # cursor.fetchall returns an empty list if no rows are
    # found, so check if myresults is falsey
    if not myresults:
        tk.messagebox.showinfo("No Events","You Have Not Created Any Events to Take Attendance From.")
        return
    EventList = [i for i in myresults]

    AttendanceOptionMenu = tk.OptionMenu(Attendance, AttendanceEvent, *EventList)
    AttendanceOptionMenu.grid(row=2, column=2)
    Attendance.tkraise()
    return

推荐阅读