Als ich tkinter in einem anderen Thread startete, fiel es mir schwer, das Programm normal zu beenden, sodass ich die Informationen weitergeben werde.
tkinter schleift das Zeichnen und die Ereignisverarbeitung durch Aufrufen von mainloop ()
.
Sie können "mainloop ()" beenden, indem Sie "destroy ()" in tkinter aufrufen.
Danach, wenn der Thread endet, wird auch tkinter zerstört.
Wenn jedoch "destroy ()" von einem anderen Thread aufgerufen wurde oder das tkinter-Widget (GUI-Teil) der Instanzvariablen noch zugewiesen wurde, konnte das Programm nicht normal beendet werden.
Ich werde mit einem Beispielprogramm erklären.
import time
import threading
import tkinter as tk
class GUI:
def start(self):
self.running = True
self.window = tk.Tk()
self.window.title("Sample")
self.window.geometry('320x240')
self.value = tk.StringVar()
entry = tk.Entry(textvariable=self.value)
entry.pack()
self.window.after(1000, self._check_to_quit)
self.window.mainloop()
# need to delete variables that reference tkinter objects in the thread
del self.value
del self.window
def _check_to_quit(self):
if self.running:
self.window.after(1000, self._check_to_quit)
else:
self.window.destroy()
def quit(self):
self.running = False
def main():
gui = GUI()
thread = threading.Thread(target=gui.start)
thread.start()
time.sleep(2)
for i in 1, 2, 3, 'Dar!!':
gui.value.set(i)
time.sleep(1)
gui.quit()
thread.join()
if __name__ == '__main__':
main()
main ()
erstellt eine GUI und einen Subthread und der Subthread startet gui.start ()
.
Wenn Sie den Prozess main ()
beenden, rufen Siegui.quit ()
auf, um das End-Flag so zu setzen, dass der Subthread in Intervallen von 1 Sekunde überprüft und der Subthread selbstdestroy ()
aufruft. Ich mache es.
Das direkte Aufrufen von gui.window.destroy () anstelle dieses gui.quit () verursachte eine Endlosschleife.
Ich konnte "STRG + C" nicht hören und hatte keine andere Wahl, als die Beendigung (Core Dump) mit "STRG +" zu erzwingen.
Im Subthread lautet die Instanzvariable nach dem Beenden von "mainloop ()" "del". Wenn diese "del" -Verarbeitung nicht durchgeführt wird, kann das Programm abnormal beendet (Core Dump) oder Fehlermeldungen endlos ausgeben.
Experimentieren Sie mit dem, was passiert, indem Sie gui.window.destroy () direkt von main () aus ausführen oder die Del-Verarbeitung der Instanzvariablen auskommentieren.
Seien Sie vorsichtig, wenn Sie tkinter und Fäden zusammen verwenden.