2016-04-30 4 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

self.root.update() в конце метода drawLine должен сделать трюк. – 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() 
Смежные вопросы