Использование кнопки Tkinter для остановки итерирующей функции - PullRequest
0 голосов
/ 13 января 2020

Я создал GUI с кнопкой «Стоп». Когда запускается GUI, вызывается другой модуль, содержащий некоторое время l oop для фоновой функции. Кнопка остановки будет использоваться для передачи переменной в l oop для ее остановки. Однако, когда модуль, содержащий l oop, называется GUI, он зависает. Я рассмотрел возможность использования библиотеки "threading", но не могу найти никакого содержимого, указанного в tkinter c. Любой совет или небольшой пример того, как вы будете создавать код, очень помог бы.

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Вот основа c GUI с 2 кнопками, которые могут запускать и останавливать поток, который увеличивает переменную count.

Я позволю вам попробовать это:

import tkinter as tk
import threading
import time

class GUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("test")
        self.button_start = tk.Button(self, text="Start", command=self.start_thread)
        self.button_start.pack()
        self.button_stop = tk.Button(self, text="Stop", command=self.stop_thread)
        self.button_stop.pack()
        self.count = 0
        self.continue_thread = True


    def start_thread(self):
        self.count = 0
        self.continue_thread = True

        self.t1 = threading.Thread(target = self.counter)
        self.t1.daemon = True # With this parameter, the thread functions stops when you stop the main program
        self.t1.start()

    def stop_thread(self):
        self.continue_thread = False
        self.t1.join()

    def counter (self):
        while self.continue_thread:
            print("i =", self.count)
            self.count += 1
            time.sleep(1)

if __name__ == "__main__":
    app = GUI()
    app.mainloop()
0 голосов
/ 13 января 2020

Это просто пример программы, иллюстрирующей, как убить работающий поток.

    import threading 
    import time 

    def run(): 
        while True: 
            print('thread running') 
            global stop_threads 
            if stop_threads: 
                break



    if __name__=="__main__":
        stop_threads = False
        t1 = threading.Thread(target = run) ##background loop
        t1.start() 
        time.sleep(1) 
        #while clicking on the button in GUI kill the thread like this
        stop_threads = True 
        t1.join() 
        print('thread killed')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...