在另一个函数中调用列表-Python
当点击按钮时,我试图从sqlite3数据库中更新tkinter中的这个列表框。实际上,我使用root.after(1000,function)方法让它工作,但每次更新时光标都会重置 目前,我无法通过单击按钮来填充列表框 我愿意得到任何帮助。谢谢在另一个函数中调用列表-Python,python,python-3.x,list,function,tkinter,Python,Python 3.x,List,Function,Tkinter,当点击按钮时,我试图从sqlite3数据库中更新tkinter中的这个列表框。实际上,我使用root.after(1000,function)方法让它工作,但每次更新时光标都会重置 目前,我无法通过单击按钮来填充列表框 我愿意得到任何帮助。谢谢 root=Tk() ListBox1 = Listbox(root) ListBox1.grid(row=0, column=0 , sticky='nsew') def ListUpdate(): listlist = [] #popula
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')
你用错命令了。替换:
Button(..., command=ListPopulate(listlist))
与:
你用错命令了。替换:
Button(..., command=ListPopulate(listlist))
与:
创建按钮时,
按钮的命令=
参数调用列表填充(listlist)
,并将其结果(即无
,因为您不从该函数返回任何内容)指定为命令。因此,您已经告诉按钮
对象它没有命令
在事件驱动系统中,将列表传递到它需要到达的所有位置时,您自然会遇到问题。一种方法是将listListList
作为全局变量。在脚本顶部的所有函数之外定义它,并使用其他变量:
ListBox1 = Listbox(root)
ListBox1.grid(row=0, column=0 , sticky='nsew')
listlist = []
接下来,将ListUpdate()
的第一行更改为使用切片分配清空现有列表对象,这样就不需要在该函数中声明对象全局
def ListUpdate():
listlist[:] = []
然后将listpublate()
更改为不带参数,因为它将使用全局listlist
def ListPopulate():
最后,编写按钮()
ButtonUpdate = Button(root, text='Update', command=ListPopulate)
通吃通常是不好的习惯。您可能应该做的是子类Listbox
,并给它一个保存列表的属性。那么你的两个函数就是这个类的方法。(事实上,您可能想在每次更改屏幕上显示的列表的内容时更新它……因此您应该有一种方法,而不是两种方法。)我将把它作为学习面向对象编程时的练习。您的命令=
参数,用于按钮调用列表填充(listlist)
创建按钮并将其结果(即None
,因为您不从该函数返回任何内容)指定为命令时。因此,您已经告诉按钮
对象它没有命令
在事件驱动系统中,将列表传递到它需要到达的所有位置时,您自然会遇到问题。一种方法是将listListList
作为全局变量。在脚本顶部的所有函数之外定义它,并使用其他变量:
ListBox1 = Listbox(root)
ListBox1.grid(row=0, column=0 , sticky='nsew')
listlist = []
接下来,将ListUpdate()
的第一行更改为使用切片分配清空现有列表对象,这样就不需要在该函数中声明对象全局
def ListUpdate():
listlist[:] = []
然后将listpublate()
更改为不带参数,因为它将使用全局listlist
def ListPopulate():
最后,编写按钮()
ButtonUpdate = Button(root, text='Update', command=ListPopulate)
通吃通常是不好的习惯。您可能应该做的是子类Listbox
,并给它一个保存列表的属性。那么你的两个函数就是这个类的方法。(事实上,每次更改屏幕上显示的列表的内容时,您可能都想更新它……所以您应该有一种方法,而不是两种方法。)我将把它作为练习留给您学习面向对象编程时使用。谢谢!!这很有帮助。它可以工作,因为当我单击“更新”时光标重置到顶部,但是当我向数据库添加新数据时,它不会更新列表。在(1000,ListUpdate)和上面的打印(listlist)之后,在控制台中只打印一次。我有什么明显的遗漏吗?谢谢!!这很有帮助。它可以工作,因为当我单击“更新”时光标重置到顶部,但是当我向数据库添加新数据时,它不会更新列表。在(1000,ListUpdate)和上面的打印(listlist)之后,在控制台中只打印一次。我有什么明显的遗漏吗?