画布在tkinter中更新

时间:2016-04-30 10:48:25

标签: python tkinter

我是tkinter的新手,并编写了一个简单的骨架程序,在画布上绘制了五行。我想在每个新行之后更新画布。我几乎在那里(!),但画布不会更新,直到计算完所有行。关于如何修复我的代码的所有建议将非常感激。谢谢!

from tkinter import *
from time import sleep

class app():
    def __init__(self):
        self.root = Tk()
        self.canvas = Canvas(self.root, width=300, height=300)
        self.canvas.pack()   

        self.go()
        self.root.mainloop()

    def go(self):
        for i in range(5):
            self.drawLine(i)
            sleep(1) # simulate computation of next value

    def drawLine(self, n):
        self.canvas.create_line(0, 0, 50, n * 50 + 10)
        # now I would like canvas to be updated with the new line added

app()

1 个答案:

答案 0 :(得分:0)

sleep与tkinter不兼容,因为它会阻止事件循环。一起使用它们通常会导致您的tkinter窗口冻结。睡五秒钟可能会或可能不会在您的计算机上造成这种情况,但仍然非常不可靠。如果您以后想要显示15行而不是5行,那么您的程序几乎可以保证停止工作。

这里的正确解决方案是使用根对象的after方法。 after在一定时间内执行指定的函数。以下是代码的工作示例:

from tkinter import *

class app():
    def __init__(self):
        self.root = Tk()
        self.canvas = Canvas(self.root, width=300, height=300)
        self.canvas.pack()

        self.line_counter = 0
        self.draw_next_line()
        self.root.mainloop()

    def draw_next_line(self):
        self.canvas.create_line(0, 0, 50, self.line_counter * 50 + 10)
        self.line_counter += 1
        if self.line_counter != 5:
            # call this function again after 1000 milliseconds
            self.root.after(1000, self.draw_next_line)

app()