[PYTHON] Wenn tkinter in einem anderen Thread gestartet wird, beenden Sie die Verarbeitung durch diesen Thread selbst, bereinigen Sie die Variablen und beenden Sie den Thread.

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.

Recommended Posts

Wenn tkinter in einem anderen Thread gestartet wird, beenden Sie die Verarbeitung durch diesen Thread selbst, bereinigen Sie die Variablen und beenden Sie den Thread.
Suchen Sie den Namen und die Daten einer freien Variablen in einem Funktionsobjekt