2017-04-18 2 views
0

간단한 예제에서 tKinter가있는 Python GUI를 만들었습니다. 카운터를 증가시키는 간단한 루프를 트리거하는 버튼이 있습니다. 성공적으로 카운터를 스레딩하여 내 GUI가 멈추지 않게했지만 계산을 멈추는 데 문제가 있습니다. 여기 내 코드는 다음과 같습니다.tKinter 다중 스레딩 스레드 중지

# threading_example.py 
import threading 
from threading import Event 
import time 
from tkinter import Tk, Button 


root = Tk() 

class Control(object): 

    def __init__(self): 
     self.my_thread = None 
     self.stopThread = False 

    def just_wait(self): 
     while not self.stopThread: 
      for i in range(10000): 
       time.sleep(1) 
       print(i) 

    def button_callback(self): 
     self.my_thread = threading.Thread(target=self.just_wait) 
     self.my_thread.start() 

    def button_callbackStop(self): 
     self.stopThread = True 
     self.my_thread.join() 
     self.my_thread = None 


control = Control() 
button = Button(root, text='Run long thread.', command=control.button_callback) 
button.pack() 
button2 = Button(root, text='stop long thread.', command=control.button_callbackStop) 
button2.pack() 


root.mainloop() 

안전하게 카운터 스톱을 증가시키고 정상적으로 닫을 수 있습니까?

답변

1

당신은

+0

어떻게해야합니까? – Vince

2

그래서 당신은 루프와 while 루프를 병렬로 실행할 for 루프 내에서 self.stopThread를 확인해야? 글쎄 그들은 그렇게 할 수 없다. 가지고있는 동안 for 루프가 실행 중이며 while 루프 조건에주의를 기울이지 않습니다.

단일 루프 만 만들어야합니다. 스레드가 10000 사이클 후에 자동 종료되도록하려면 다음과 같이 할 수 있습니다.

def just_wait(self): 
    for i in range(10000): 
     if self.stopThread: 
      break # early termination 
     time.sleep(1) 
     print(i) 
+0

안녕하세요, Johnathan 감사합니다. 뇌가 방구 한 순간이었습니다. – Vince