Tkinter上的多个After使GUI冻结

时间:2018-07-23 10:21:51

标签: python loops user-interface tkinter

最近我在Tkinter gui上使用Python进行工作。问题是,我想通过在一段时间内将其状态从“隐藏”更改为“正常”来显示一些行,比如说1s。

因此,该行将在1秒钟内以1出现1。 当我尝试时,命令行运行正常(我在Windows cmd上打印了一些文本)但是,gui冻结到计算结束,然后所有行都显示出来(不是1比1),idk为什么?我是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')

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

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

1 个答案:

答案 0 :(得分:0)

与其使用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()