2014-11-25 5 views
0

나는 매초 TKinter 창을 업데이트하려고합니다. 그래서 아이디어는 창을 열어야하고, 파이썬이 필드를 업데이트하고, 업데이트 된 창을 표시하도록하는 것입니다. 지금 상황은 두 번째 창이 첫 번째 창을 닫을 때만 표시된다는 것입니다. 나는 이것이 mainloop()과 관련이 있다고 생각한다. .update() 및 .update_idletasks()를 살펴 보았지만 구현 방법을 알 수 없습니다. TKinter는 주택이있는 필드를 표시하는 데 사용됩니다. 그래서 일반적으로이 작업을 수행해야입니다 :python tkinter 창을 업데이트하는 방법

  • 은 (이미 구현) 주택
  • 쇼의 새 위치를 생성 (이미 구현) 그것에 주택 (이미 구현) 집 위치
  • 표시 필드를 생성 업데이트 된 필드

이것은 현재 코드입니다. 업데이트 기능이 필요한지 확실하지 않습니다.

class Plot(tk.Frame): 
     def __init__(self, master=None): 
      tk.Frame.__init__(self, master) 
      self.grid() 

     def createWidgets(self, list_houses): 
      houses = list_houses 
      self.w = tk.Canvas(self, width = field.width*SIZE, height = field.height*SIZE, bg = '#E4E4E4') 

      ... 

      self.w.grid() 

     def update(self): 
      ? 

#GENERATES FIELD AND HOUSES 
... 

#PRINT FIRST WINDOW 
plot = Plot() 
plot.createWidgets(houses) <- PUT HOUSES IN TK INTER 
plot.master.title('map of houses') 
plot.mainloop() 

# UPDATE FIELD <- THIS PART IS ONLY EXECUTED WHEN I CLOSE THE FIRST WINDOW, WHY? 
i = 0 
while i < 2: 
    update = field.update_houses(houses) <- GENERATES NEW LOCATION OF HOUSES 

    #PRINT UPDATED WINDOW, IT SHOULD BE PRINTED IN THE SAME WINDOW! 
    plot = Plot() 
    plot.createWidgets(houses) <- PUT HOUSES IN TKINTER 
    plot.master.title('map of houses') 

    i += 1 

미리 감사드립니다.

답변

4

업데이트 필드는 창이 닫힐 때까지 tkinter의 메인 루프가 계속 실행되기 때문에 창을 닫을 때만 실행됩니다. 이 메인 루프 때문에 tkinter에서 (long) while 루프를 사용하는 것은 좋지 않습니다. 왜냐하면 while 루프가 tkinter 메인 루프를 잠그기 때문입니다.

메인 루프를 차단하지 않고 여러 번 작업을 수행하려면 after 메서드를 사용하십시오. 이것은 일정 시간 후에 함수를 호출합니다. mainloop에 들어가기 전에 한 번 호출 한 다음 update 함수에서 다시 호출하여 update 함수가 자신을 호출하도록 할 수 있습니다. 매 초마다 업데이트 기능을 실행 after를 사용하는이 작은 예를 살펴 :

import Tkinter as tk 
import random 

def update(): 
    l.config(text=str(random.random())) 
    root.after(1000, update) 

root = tk.Tk() 
l = tk.Label(text='0') 
l.pack() 
root.after(1000, update) 
root.mainloop() 
2

당신이 창에 .update를 사용할 수 있습니다. 그러면 창을 업데이트하고 모든 항목을 창에 표시 할 수 있습니다.

관련 문제