在tkinter中传递参数传递线程时中断while循环

时间:2018-11-06 13:29:52

标签: python multithreading tkinter while-loop

我正在尝试在线程化时使用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()

1 个答案:

答案 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()