我正在尝试在线程化时使用tkinter中断while循环。如果我将log变量设置为全局变量,则可以打破循环,但是我宁愿远离全局变量,任何建议都将不胜感激。
import tkinter as tk
import threading
import time
def gui_input():
root = tk.Tk()
def close_window():
root.destroy()
def logging(buttonId):
global log
if buttonId == 1:
log=True
elif buttonId == 2:
log=False
def run():
while True:
print('hello')
time.sleep(1)
if log==False:
break
thread = threading.Thread(target=run)
thread.start()
def main():
# create the GUI
label = tk.Label(root, text="Balance Table Input:")
#optionList = ['fixed','simple support','free','concentrated load','distributed load','pin']
label.grid(column=1,row=1,columnspan=1,sticky='EW')
submit1 = tk.Button(root,text='Close',command = lambda:close_window())
submit1.grid(column=3,row=2,columnspan=1,sticky='EW')
submit2 = tk.Button(root,text='Record',command = lambda:logging(1))
submit2.grid(column=3,row=5,columnspan=1,sticky='EW')
submit3 = tk.Button(root,text='Stop Logging',command = lambda:logging(2))
submit3.grid(column=3,row=8,columnspan=1,sticky='EW')
main()
root.mainloop()
return()
gui_input()
答案 0 :(得分:2)
我宁愿远离全局变量。
避免全局变量IMO的最佳方法是建立一个类并使用类属性来管理变量。因此,我的示例会将您的代码转换为类。
am尝试在线程执行时使用tkinter中断while循环。
老实说,在大多数情况下,您希望在Tkinter中避免使用while循环。 Tkinter是事件驱动的,因此mainloop()
被阻塞直到while循环结束为止,而在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()