python - 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()
这是一个发生的例子。
用户启动程序并看到这个界面:
用户按下“开始”按钮,移动框架:
请参阅选项菜单中的可用选项。
用户按“返回”,返回原帧
用户按下“开始”,查看选项菜单中可用的选项
此外,如果它们是对 eventname 列的附加或删除,我希望更改反映在选项菜单中。
例如,我删除“露营”。我应该在我的选项菜单中留下打结、博尔德之旅、跋涉轨道。
如果您需要查看我的数据库或表格,请询问。提前致谢!
PS:不知道为什么 {} 包含除第一个选项之外的每个选项。这不是故意的。
解决方案
您将查询结果附加到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
推荐阅读
- node.js - NodeJS - 将数据插入索引的弹性搜索
- c# - C# 8.0 中是否有针对非空值的“检查并获取”运算符?
- java - 如何解决 for 循环中的 InvocationTargetException?(寻找整个堆栈跟踪)
- asp.net-core - Asp.NETCore 3.1 With Swagger launchUrl 在发布后不起作用
- android - 当其子项更改可见性时,如何获取 ViewGroup 的新大小?
- spring - 如何返回我的自定义 json 文件而不是生成 spring boot 的默认 json 文件?
- php - 下载文件laravel 5.7后重定向
- node.js - 带有节点服务器和 react-admin 的 API URL
- reactjs - 如何在 redux 存储和操作中传递类变量?
- javascript - 在chartJs中禁用或隐藏图表的YAix