在另一个函数中调用列表-Python

在另一个函数中调用列表-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

当点击按钮时,我试图从sqlite3数据库中更新tkinter中的这个列表框。实际上,我使用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')

你用错命令了。替换:

Button(..., command=ListPopulate(listlist))
与:


你用错命令了。替换:

Button(..., command=ListPopulate(listlist))
与:


创建按钮时,
按钮的
命令=
参数调用
列表填充(listlist)
,并将其结果(即
,因为您不从该函数返回任何内容)指定为命令。因此,您已经告诉
按钮
对象它没有命令

在事件驱动系统中,将列表传递到它需要到达的所有位置时,您自然会遇到问题。一种方法是将list
ListList
作为全局变量。在脚本顶部的所有函数之外定义它,并使用其他变量:

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
,因为您不从该函数返回任何内容)指定为命令时。因此,您已经告诉
按钮
对象它没有命令

在事件驱动系统中,将列表传递到它需要到达的所有位置时,您自然会遇到问题。一种方法是将list
ListList
作为全局变量。在脚本顶部的所有函数之外定义它,并使用其他变量:

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)之后,在控制台中只打印一次。我有什么明显的遗漏吗?