Я бы предпочел держаться подальше от глобальных переменных.
Лучший способ избежать глобальных переменных IMO - это создать класс и использовать атрибут класса для управления переменной. Так что мой пример преобразует ваш код в класс.
Я пытаюсь разорвать цикл с помощью tkinter во время работы с потоками.
Честно говоря, в то время как циклы в то время вы хотите избежать в Tkinter. Tkinter управляется событиями, поэтому во время цикла while происходит то, что mainloop()
блокируется до завершения цикла while. (Я знаю, что вы используете многопоточность для функции run()
, но в любом случае вы должны знать ее важную информацию о tkinter). Этого можно избежать, используя метод tkinter after()
с after()
. Мы можем создать простой цикл, который проверяет значение и затем что-то делает.
Вот упрощенный пример использования вашего кода:
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
label = tk.Label(self, text="Balance Table Input:")
label.grid(column=1, row=1, columnspan=1, sticky='EW')
submit1 = tk.Button(self, text='Close', command=self.close_window)
submit1.grid(column=3, row=2, columnspan=1, sticky='EW')
submit2 = tk.Button(self, text='Record', command=lambda:self.logging(True))
submit2.grid(column=3, row=5, columnspan=1, sticky='EW')
submit3 = tk.Button(self, text='Stop Logging', command=lambda:self.logging(False))
submit3.grid(column=3, row=8, columnspan=1, sticky='EW')
self.log = True
self.log_checker()
def close_window(self):
self.destroy()
def log_checker(self):
if self.log == True:
print("Hello")
self.after(1000, self.log_checker)
def logging(self, log_tf):
self.log = log_tf
if __name__ == "__main__":
Example().mainloop()