прервите цикл while при работе с аргументами в tkinter - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь разорвать цикл, используя tkinter во время работы с потоками. Если я сделаю переменную журнала глобальной, я могу разорвать цикл, но я бы предпочел держаться подальше от глобальных переменных, любой совет был бы оценен`

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 голосов
/ 06 ноября 2018

Я бы предпочел держаться подальше от глобальных переменных.

Лучший способ избежать глобальных переменных 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...