我是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()
答案 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()