2013-08-03 4 views
1

"시작"버튼을 눌렀을 때 반복적 인 작업을 시작할 수있는 "tkinter"인터페이스를 만들고 싶습니다. "정지"버튼을 누르면 진행중인 루프를 깨뜨릴 수 있습니다. 그러나 tkinter는 진행중인 루프가 끝날 때까지 (예 : "정지"버튼 클릭에 응답하지 않고 첨부 코드에 표시된대로 텍스트 또는 레이블 텍스트를 업데이트하지 않음) 추가 작업을 처리하지 못하는 것으로 나타났습니다. 그것은 stackoverflow에서 읽은 tkinter의 단일 스레드 특성과 관련이있는 것으로 보입니다. 누군가가 특정 코드를 도울 수 있습니까? 필자는 tkinter/Python을 처음 접했을 때 많은 일반적인 토론을 읽었지만 실제 해결책을 찾을 수 없었습니다.tkinter 버튼으로 진행중인 루프를 중단하십시오.

편집 : 또한,에 root.update()를 추가 내가 무엇을 할 것이있다

import time 
import Tkinter as Tk 

def _start(): 
    for outer in range(5): 
     if active_stat: 
      time.sleep(1) # some code in the real app 
     else: 
      break 
     for inner in range(5): 
      if active_stat: 
       #counterstr.set("%02d-%02d" % (outer,inner)) #does not update till the end of loop 
       textbox.insert(Tk.END, "%02d-%02d\n" % (outer,inner)) #does not show till the end of loop 
       print "%02d-%02d" % (outer,inner) 
       time.sleep(1) #some code in the real app 
      else: 
       break 

def _stop(): 
    active_stat=False 

active_stat=True 

root = Tk.Tk() 

#counterstr=Tk.StringVar() 
#Tk.Label(root, textvariable=counterstr).pack(side=Tk.TOP) 
textbox=Tk.Text(root) 
textbox.pack(side=Tk.TOP) 
Tk.Button(root, text='Start', command=_start).pack(side=Tk.LEFT) 
Tk.Button(root, text='Stop', command=_stop).pack(side=Tk.LEFT) 
Tk.Button(root, text='Quit', command=root.quit).pack(side=Tk.LEFT) 
root.mainloop() 
+0

나는 비슷한 일을해야했습니다. 원한다면 내 코드를 별도의 프로세스에서 실행하기 위해'processing' 모듈을 사용하여 솔루션을 게시 할 수 있습니다. –

답변

0

내가 당신 active_stat Tkinter의 변수를 만들고, 당신이 있는지 확인하려면 그 어느 때 다음의 get 메서드를 호출 할 것입니다 당신의 루프. 그것은 당신의 문제를 해결해야합니다. tkinter 변수의 이유는 변수 범위 문제 때문입니다. (참고 :이 코드는 python 3 용입니다 ...)

import time 
import tkinter as Tk 

def _start(): 
    for outer in range(5): 
     if active_stat.get(): 
      time.sleep(1) # some code in the real app 
     else: 
      active_stat.set(True) 
      break 
     for inner in range(5): 
      if active_stat.get(): 
       #counterstr.set("%02d-%02d" % (outer,inner)) #does not update till the end of loop 
       textbox.insert(Tk.END, "%02d-%02d\n" % (outer,inner)) #does not show till the end of loop 
       print ("{}-{}".format(outer,inner)) 
       time.sleep(1) #some code in the real app 
      else: 
       active_stat.set(True) 
       break 
      root.update() 

def _stop(): 
    active_stat.set(False) 


root = Tk.Tk() 

active_stat = Tk.BooleanVar(root) 
active_stat.set(True) 

#counterstr=Tk.StringVar() 
#Tk.Label(root, textvariable=counterstr).pack(side=Tk.TOP) 
textbox=Tk.Text(root) 
textbox.pack(side=Tk.TOP) 
Tk.Button(root, text='Start', command=_start).pack(side=Tk.LEFT) 
Tk.Button(root, text='Stop', command=_stop).pack(side=Tk.LEFT) 
Tk.Button(root, text='Quit', command=root.quit).pack(side=Tk.LEFT) 
root.mainloop() 
+0

당신의 아이디어는 좋지만, 이렇게하면 효과가 없을 것입니다. 루트 창을 만든 후에 BooleanVar를 만들어야합니다. 그렇지 않으면 폭발합니다. – iCodez

+0

The-IT 및 iCodez : 좋습니다! 이게 내가 원하는대로 일하고있어. 고맙습니다. – lychee10

+0

Eric Urban에게 : 안녕 Eric, 나는 당신이 처리 모듈로 어떻게하는지보고 싶습니다. 당신의 솔루션을 올리시겠습니까? 감사! – lychee10

관련 문제