I'm using threading to run a long task, but I ran into an issue. The thread just hung while trying to set an IntVar after I clicked the close button. It doesn't even error. I don't want to use a daemon thread because the function is a critical part of the program, which might have consequences if it stops midway through (it deals with a bunch of files).
Here's an oversimplified version of my program, meant to demonstrate my issue.
import tkinter as tk
import tkinter.ttk as ttk
import threading
class Window(tk.Tk):
    def __init__(this, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        
        this.threads = []
        this.var = tk.IntVar(value=0)
        
        this.label = ttk.Label(textvariable=this.var)
        this.button = ttk.Button(text='Start counter', command=this.startCounter)
        
        this.label.pack()
        this.button.pack()
        
        this.stop = False
        
        this.protocol("WM_DELETE_WINDOW", this.close)
        
    def startCounter(this):
        thread = threading.Thread(target=this.counter)
        this.threads.append(thread)
        thread.start()
        
    def counter(this):
        while True:
            if this.stop:
                print(f'self.stop = ')
                break
            this.var.set(this.var.get() + 1)
        
    def close(this):
        print('Stopping threads')
        this.stop = True
        
        this.waitThreads()
        
        print('Stopped threads')
        this.destroy()
    
    def waitThreads(this):
        for thread in this.threads:
            thread.join()
Window().mainloop()
My program is using an InVar for a progress bar, not a counter, this was just the best way I could demonstrate the issue.
I tried a bunch of different methods to stop all threads, but none of them worked (that was before I knew what the issue was). For some reason in my actual program, if I log the var and the value of the var before the stop check, it's able to stop. I could not reproduce that with my test script.
I'm expecting the set var line to move on, or error instead of just hang.
Why is it hanging, and how can I fix this? I want to be able to safely stop the thread(s), and I don't want to use a daemon.
 
     
    