当单击按钮时,我试图在 tkinter 中获取此列表框以从 sqlite3 数据库更新。我实际上使用 root.after(1000, function) 方法让它工作,但每次更新时光标都会不断重置。
目前我无法在单击按钮时填充列表框。
我会喜欢任何帮助。谢谢!
root=Tk()
ListBox1 = Listbox(root)
ListBox1.grid(row=0, column=0 , sticky='nsew')
def ListUpdate():
listlist = []
#populates list from sql database in a for loop
return listlist
def ListPopulate(listlist):
ListBox1.delete(0, END)
for i in range(0,len(listlist[i]):
ListBox1.insert(END, listlist[i])
ButtonUpdate = Button(root, text='Update', command=ListPopulate(listlist))
ButtonUpdate.grid(row=5, column=6, sticky='nsew')
你command=
对你的论点Button
呼叫ListPopulate(listlist)
按钮时,创建并分配其结果(这是None
因为你不返回从函数的任何信息)作为命令。因此,您已告诉Button
对象它没有命令。
在将列表传递到事件驱动系统中它需要去的所有地方时,您自然会遇到问题。一种方法是使列表ListList
成为全局变量。在脚本顶部的所有函数之外使用其他变量定义它:
ListBox1 = Listbox(root)
ListBox1.grid(row=0, column=0 , sticky='nsew')
listlist = []
接下来,将第一行更改ListUpdate()
为使用切片赋值来清空现有的列表对象,因此您无需在该函数中声明该对象为全局对象。
def ListUpdate():
listlist[:] = []
然后更改ListPopulate()
为不带任何参数,因为它将使用 global listlist
。
def ListPopulate():
最后,编写您的Button()
构造函数以传递ListPopulate
而不是调用它。
ButtonUpdate = Button(root, text='Update', command=ListPopulate)
全局变量通常是不好的做法。你可能应该做的是子类化Listbox
并给它一个包含列表的属性。那么你的两个函数将是该类的方法。(实际上,您可能希望每次更改内容时都更新屏幕上显示的列表……所以您应该有一种方法,而不是两种。)我将把它留作学习面向对象编程时的练习.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句