在另一个函数中调用列表 - Python [重复]

Posted

技术标签:

【中文标题】在另一个函数中调用列表 - Python [重复]【英文标题】:Calling a list in another function - Python [duplicate] 【发布时间】:2018-08-11 16:43:38 【问题描述】:

我试图在 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')

【问题讨论】:

【参考方案1】:

您使用的命令错误。替换:

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

与:

Button(..., command=lambda l=ListUpdate(): ListPopulate(l))

【讨论】:

【参考方案2】:

Buttoncommand= 参数在创建按钮时调用 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 并给它一个包含列表的属性。那么你的两个函数将是该类的方法。 (事实上​​,您可能希望每次更改内容时都更新屏幕上显示的列表……所以您应该有一种方法,而不是两种。)我将把它留作练习,以供您学习面向对象编程时使用.

【讨论】:

谢谢!!这很有帮助。它可以工作,我可以判断,因为当我单击“更新”时光标会重置到顶部,但是当我将新数据添加到数据库时,它不会更新列表。我在它上面放了一个 root.after(1000, ListUpdate) 和一个 print(listlist) ,在控制台中它只打印一次。我有什么明显的遗漏吗?

以上是关于在另一个函数中调用列表 - Python [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java在另一个[重复]中调用构造函数

python 判断某个列表中的所有元素在另一个列表中

从一个列表中删除元素如果不包含在另一个列表中。 C# [重复]

Python基础之函数和模块

当在另一个页面上调用类时,私有函数__construct()不起作用[重复]

Python / Kivy - 在另一个调用函数的屏幕中替换标签的值