我试图让tkinter中的这个Listbox在点击按钮时从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')
答案 0 :(得分:2)
您使用命令错误。替换:
Button(..., command=ListPopulate(listlist))
使用:
Button(..., command=lambda l=ListUpdate(): ListPopulate(l))
答案 1 :(得分:1)
创建按钮时command=
调用Button
的ListPopulate(listlist)
参数并分配其结果(None
,因为您作为命令,不要从该函数返回任何内容。因此,您告诉Button
对象它没有命令。
您自然会遇到将列表传递到事件驱动系统中所需的所有位置的问题。一种方法是使列表ListList
成为全局变量。使用其他变量在脚本顶部的所有函数之外定义它:
ListBox1 = Listbox(root)
ListBox1.grid(row=0, column=0 , sticky='nsew')
listlist = []
接下来,更改ListUpdate()
的第一行以使用切片分配来清空现有列表对象,因此您不需要在该函数中声明对象全局。
def ListUpdate():
listlist[:] = []
然后更改ListPopulate()
不参加任何参数,因为它将使用全局listlist
。
def ListPopulate():
最后,编写Button()
构造函数来传递ListPopulate
而不是调用它。
ButtonUpdate = Button(root, text='Update', command=ListPopulate)
全球通常是不好的做法。你可能应该做的是子类Listbox
并给它一个保存列表的属性。那么你的两个函数就是那个类的方法。 (事实上,您可能希望每次更改其内容时都更新屏幕上显示的列表...所以您应该有一种方法,而不是两种方法。)我将此作为练习,当您学习对象时 - 面向编程。