2011-07-26 4 views
1

파이썬의 Tk 인터페이스는 쓰레드를 사용할 때 약간의 문제가 있다는 것을 알고 있고, 이미 문제가 있습니다. 내 생각은 이제 Queue.Queue을 사용하여 다음 예제와 같이 Tk 메인 루프에 이벤트를 전달합니다. 물론파이썬 Tk를 쓰레드 코드의 프론트 엔드로 사용하기

from Tkinter import * 
import Queue 
import time 

# this queue will be filled by other threads 
queue = Queue.Queue() 
queue.put("Helloooo!") 
queue.put("hi there, everyone!") 

class Application(Frame): 
    def update(self): 
     while True: 
      try: 
       text = queue.get(False) 
       self.hi_there["text"] = text 
       time.sleep(3) 
      except Queue.Empty: 
       self.quit() 

    def create_widgets(self): 
     self.hi_there = Label(self) 
     self.hi_there["text"] = "Hello" 

     self.hi_there.pack({"side": "left"}) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.create_widgets() 

root = Tk() 
app = Application(master=root) 
app.update() 
app.mainloop() 

, 내가 update에게 자신을 호출하지 않아야합니다 (이것은 UI도 표시되기 전에 모든 것을 실행합니다)하지만 주회 돌이 동안 그 처리의 Tk가 필요합니다.

특정 상황에서 깨지지 않는 Tk로이를 수행 할 수있는 확실한 방법이 있습니까? 아니면 그냥 Qt에 의존해야합니까?

+1

답변을 참조 2400262/code-a-timer-in-a-python-gui-in-tkinter –

+0

여러분 중 한 명은 대답으로 게시합니다! – agf

+0

@eryksun : 나는이 방법들에 대해 잘 몰랐습니다. – Debilski

답변

3

일반적으로 GUI 응용 프로그램은 절대로 sleep을 호출해서는 안되며 무한 루프 (이벤트 루프 제외)가 없어야하며 '업데이트'를 호출해서는 안됩니다. 결코 업데이트를 호출하지 않는 유일한 예외는 당신이 왜 안되는지 진정으로 이해할 때만 괜찮습니다.

두 가지 작업을 수행하는 방법을 만듭니다. 대기열을 확인한 다음 '후'를 사용하여 일정 시간이 지나면 자신을 호출합니다. 그런 다음 다른 모든 초기화가 수행 된 후 이벤트 루프를 시작하기 직전에 프로그램의 시작 부분에서이 메서드를 한 번 호출하십시오. http://stackoverflow.com/questions/ : 이러한 기능의 작동 예를 들어

의`(가)`방법을 반복 호출을 설정하는 후 사용에 대한이 질문에 토론 How to create a timer using tkinter?

+0

나는 이해한다. 물론 'sleep'과 재귀 메소드는 별도의 스레드에 존재한다는 의미였습니다. Tk에서는 잘 작동하지 않았습니다. – Debilski

+0

하지만'after'는 잘 작동하므로, 물론 사용하겠습니다. – Debilski

관련 문제