【问题标题】:Finding it difficult to update a listbox dynamically within a tikinter window发现很难在 tkinter 窗口中动态更新列表框
【发布时间】:2016-02-04 12:04:15
【问题描述】:

我正在创建一个简单的 tkinter 列表并用数字列表填充它。然后我正在删除列表的一部分,并希望在我运行删除功能后立即将更改反映在列表框中。

我在函数中使用了update_idletasks(),但它没有更新列表。有人可以帮我解决这个问题吗?

from tkinter import *


main = Tk()

b1 = Button(main,text='delete section',command=lambda:func())
b1.pack()

l1 = Listbox(main)
l1.pack()

mylist =[]

for i in range(0,100):
    mylist.append(i)

for k in mylist:
    l1.insert(0,k)

def func():
    del mylist[50:100]
l1.update_idletasks()

main.mainloop()

【问题讨论】:

  • 顺便说一下我用的是python 3.4

标签: python python-3.x tkinter listbox python-3.4


【解决方案1】:

update_idletasks(self)

进入事件循环,直到所有空闲回调都被调用。这将更新窗口的显示,但不会更新用户引起的事件。

update_idletasks 不是您想要使用的,如果您只想使用新列表更新列表框。

有几种方法可以做到这一点。您可以删除索引 50 到 100 的所有项目

l1.delete(50, 100)

或者您可以从列表中删除每个项目并重新添加它们

del mylist[50:100]
li.delete(0, END)
for k in mylist:
    l1.insert(0, k)

另外,如果您希望使用第一个选项,从索引 50 删除到 100。您需要将当前插入行从 l1.insert(0, k) 更改为 l1.insert(END, k) 这样它会按升序添加到列表中.

我之所以提到这一点,是因为您似乎想保留0, 1, .. , 48, 49。但如果您希望它们按降序排列,请改用l1.delete(0, 49)

【讨论】:

  • 谢谢。我喜欢第二个选项,基本上这意味着我要删除当前更新的列表框并从更新的列表中重新创建它。它有效。
猜你喜欢
  • 2017-08-09
  • 2017-07-27
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多