【问题标题】:Multiple After on Tkinter made the GUI frozenTkinter 上的多个 After 使 GUI 冻结
【发布时间】:2018-12-30 18:30:45
【问题描述】:

最近我正在使用 Python 和 Tkinter gui。问题是,我想通过在某个时间间隔内将其状态从隐藏更改为正常来显示一些行,比如说 1s。

因此,该行将在 1 秒内逐个显示。 当我尝试时,命令行完美运行(我在 windows cmd 上打印了一些文本)但是,gui 冻结到计算结束,然后所有的行都显示出来了(不是 1 对 1),我知道为什么?我是 python 新手 :(

这是我的虚拟代码

def delay():
allline=mainframe.find_withtag('line')
for i in allline:
    tags=mainframe.gettags(i)
    print(tags[0])
    root.after(1000, mainframe.itemconfigure(tags[0],state='normal'))
......
mainframe.create_line((50,50,100,100),...,tags=('line1','line'),state='hidden')
mainframe.create_line((150,150,100,100),...,tags=('line2','line'),state='hidden')

假设我有一个触发延迟功能的按钮。

感谢您的帮助!对不起我的英语不好:)

【问题讨论】:

  • 与其使用这样的 for 循环,不如将所有行放入一个列表并调用一个函数,该函数从列表中删除第一行,显示该行,然后使用 after 调用该函数本身。下次调用该函数时,会从列表中删除下一项,使行可见等。这样 tkinter 就有时间更新屏幕。
  • 您没有正确使用after。您立即调用该函数,然后将结果提供给after 命令。
  • @Akbar Noto 不客气。

标签: python loops user-interface tkinter


【解决方案1】:

与其使用这样的 for 循环,不如将所有行放入一个列表并调用一个函数,该函数从列表中删除第一行,显示该行,然后使用 after 让函数调用自身。下次调用该函数时,会从列表中删除下一项,使行可见等。这样 tkinter 就有时间更新屏幕。

import tkinter as tk

lines = []

def showNextLine():
    global lines
    try:
        nextLine = lines.pop(0)
        canvas.itemconfigure(nextLine,state='normal')
        root.after(1000,showNextLine)
    except IndexError:
        pass
        #No more items in list.

root = tk.Tk()
canvas = tk.Canvas()
canvas.grid()
canvas.create_line((50,50,100,100),fill='red',tags=('line1','line'),state='hidden')
canvas.create_line((50,60,100,110),fill='blue',tags=('line2','line'),state='hidden')
canvas.create_line((50,70,100,120),fill='yellow',tags=('line3','line'),state='hidden')
canvas.create_line((50,80,100,130),fill='green',tags=('line4','line'),state='hidden')

lines = list(canvas.find_withtag('line'))
print(type(lines),lines)
root.after(1000,showNextLine)
root.mainloop()

【讨论】:

  • 我尝试了您的代码及其完美的工作,抱歉回复晚了。我离开了我的小镇,呵呵...我会尝试将其插入我的主要项目中,谢谢!
猜你喜欢
  • 2021-05-03
  • 2015-04-08
  • 2018-10-11
  • 1970-01-01
  • 2018-05-03
  • 2015-11-11
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多