2017-04-18 4 views
0

Ich habe eine Python-GUI mit tKinter erstellt. In meinem einfachen Beispiel habe ich eine Schaltfläche, die eine einfache Schleife auslöst, die einen Zähler inkrementiert. Ich habe den Counter erfolgreich eingefädelt, so dass meine GUI nicht einfriert, aber ich habe Probleme mit dem Countdown. Hier ist mein Code:tKinter Multithreading Einen Thread stoppen

# 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() 

Wie kann ich sicher den Zähler stoppen inkrementieren und schließen Sie den Thread?

Antwort

1

Sie haben für self.stopThread innerhalb der for Schleife überprüfen

+0

Wie soll ich vorgehen? – Vince

2

So möchten Sie ein for-Schleife und eine while-Schleife parallel laufen zu lassen? Nun, sie können nicht. Wie Sie sie haben, läuft die for-Schleife und wird die while-Schleife nicht beachten.

Sie müssen nur eine einzige Schleife machen. Wenn Sie möchten, dass der Thread nach 10000 Zyklen automatisch beendet wird, können Sie Folgendes tun:

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

Hey Johnathan danke, ich hatte einen Gehirnfurzmoment. – Vince

Verwandte Themen