2012-07-03 4 views

답변

5

,이 시도 :

from Tkinter import * 
import time 
root=Tk() 

variable=StringVar() 

def update_label(): 
    i=0 
    while 1: 
     i=i+1 
     variable.set(str(i)) 
     root.update() 

your_label=Label(root,textvariable=variable) 
your_label.pack() 
start_button=Button(root,text="start",command=update_label) 
start_button.pack() 
root.mainloop() 

당신에게 좋은 예를 제공해야한다고. 그러나 while 루프 중에 반드시 root.update()을 호출해야합니다. 그렇지 않으면 루프가 완료 될 때까지 GUI가 고정되고 (이 경우 은 절대이됩니다) 번호를 표시하지 않습니다.

update_label() 어디서든 프로그램에 액세스 할 수 있습니다. 방금 예를 들어 시작 버튼에 추가했습니다.

코드에 문제가있는 것은 while 루프를 자유롭게 설정하고 가장 중요한 것은 GUI의 메인 루프 앞에 을 설정했기 때문입니다. 이렇게하면이 루프가 무한하기 때문에 Tkintermainloop()으로 시작하지 못하게됩니다. 그러나 while 루프를 에 넣고 메인 루프를 실행 한 다음 까지 실행하면 결코 종료되지 않습니다.을 종료하면 GUI가 종료 될 때까지 메인 루프가 무한하기 때문입니다.

이 문제를 해결하려면 간단히 함수에 넣고 나중에 Tkinter의 메인 루프 중에 호출하십시오. 이 작업은 다양한 방법으로 수행 할 수 있습니다. 예를 들어 .after()을 사용하여 일정 시간이 지나면 특정 작업을 수행하거나 버튼을 누르면 명령이 실행되도록 할 수 있습니다. . 당신이 정말로 당신의 코드에서 infinate 루프를하지 않으려는 그러나

, 사용해야하는 적절한 코드는 다음과 같다 (다른 당신은 돌이) :

class App (object): 
    def __init__(self): 
     self.root=Tk() 
     self.variable=StringVar() 
     self.i=0 
     self.your_label=Label(self.root,textvariable=self.variable) 
    def grid(self): 
     self.your_label.pack() 
    def update_label(self): 
     self.i=self.i+1 
     self.variable.set(str(self.i)) 
     self.root.after(20,self.update_label) 
    def run(self): 
     self.grid() 
     self.root.after(20,self.update_label) 
     self.root.mainloop() 

if __name__=='__main__': 
    App().run() 
+0

-1 : 전화를해서는 안됩니다 GUI의 메인 스레드에서 잠자 요. 대답에서 그렇게하면 나쁜 예가됩니다. 'update'를 호출하여 결코 멈추지 않는다고 말할 때 당신은 틀린 것입니다. 잠자기가 활성화되어있는 동안에도 UI는 절반으로 잠긴 경우에도 고정됩니다. –

+0

@BryanOakley 알았어. 내가 바꿨어. –

+0

아직 올바른 해결책이 아닙니다. 엄지 손가락으로 'sleep'을 호출하는 것 외에도 무한 루프가 없어야합니다. 30 초마다 레이블을 업데이트하려면 이벤트 루프를 활용하고 'after'를 사용해야합니다. –

0

코드를

작동하지 않습니다 mainloop에 도착하지 않습니다. 이와 같은 것을보기 위해서는 mainloop에서 호출 된 콜백에서 (이벤트를 통해 간접적으로) 업데이트를 바인딩해야합니다.

여기