2016-04-30 281 views
1

我是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() 
+3

drawLine方法结束时的self.root.update()应该执行此操作。 – Mirac7

+0

谢谢,现在代码按预期工作。 – Beno

回答

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()