Запуск и остановка потока из графического интерфейса - PullRequest
0 голосов
/ 15 декабря 2018

В настоящее время я разрабатываю программу с графическим интерфейсом для сбора данных с датчика и их визуализации в графическом интерфейсе.Данные от датчика сохраняются в списке для дальнейших расчетов.

То, что я сейчас пытаюсь сделать, - это запустить процесс регистрации в новом потоке.Это должно остановить графический интерфейс от зависания.

Мой текущий код:

import tkinter as tk
import time
import threading

class GUI:
    def __init__(self, tk_object):
        self.gui = tk_object
        self.gui.title("Logger") 
        self.gui.resizable(width=True, height=True)

        self.testlabel = tk.Label(self.gui, text="Recording in process")
        self.testlabel.grid(row = 7, column = 0)
        self.testlabel.config(bg='white')

        btn1 = tk.Button(master, text="Start Recording", width=16, height=5, command=lambda: self.start_functions())
        btn1.grid(row=2,column=0)
        btn2 = tk.Button(master, text="Stop Recording", width=16, height=5, command=lambda: self.stop_functions())
        btn2.grid(row=3,column=0)

    def start_functions(self):
        """Calls the method get_sample in a new thread and changes the bg-color of the label to red""" 
        Thread_1 = threading.Thread(target=self.get_sample(), name='Thread1')        
        Thread_1.start()
        self.testlabel.config(bg='red') 

    def stop_functions(self):
        """Stops all active threads and changes bg-color of the label back to white""" 
        #stop_threads = threading.Event()
        #stop_threads.set()
        threading.Event().set()
        self.testlabel.config(bg='white')            

    def get_sample(self):
        """get data and append it to a list"""
        while not threading.Event().is_set():
            time.sleep(1)
            res_cel.append(res_cel[-1]+1)
            x_value.append(x_value[-1]+1)
        print(res_cel)
        print(x_value) 


master = tk.Tk()
master_object = GUI(master)
master.mainloop()

В настоящее время метод get_sample содержит заполнитель.Я пытаюсь остановить Thread1 (где выполняется метод get_sample) с помощью обработчика Event().

while not threading.Event().is_set():

Кажется, это не работает должным образом.Есть ли лучшие способы сделать это?Перед этим подходом я пытался использовать class для обработки потоков (это было найдено в stackoverflow, но я не могу найти его больше, извините):

class Controller(object):

def __init__(self):
    self.thread1 = None
    self.stop_threads = Event()

def run(self):
    .. do somehting

и запуск / остановка потоковчерез:

def starting_thread(self):
    self.stop_threads.clear()
    self.thread1 = Thread(target = self.run)
    self.thread1.start()

def stopping_thread(self):
    self.stop_threads.set()
    self.thread1 = None

Примечание. Эти функции относятся к классу Controller.С этим решением я не смог изменить цвет фона меток в классе GUI, так как он не знает, на какой объект он ссылается.

Я довольно новичок в программировании на python, поэтому я бы хотелБуду рад, если кто-нибудь сможет объяснить мне, что мне здесь не хватает.

Спасибо xSaturn

1 Ответ

0 голосов
/ 16 декабря 2018

Вам лучше создать свой собственный объект Thread с методом, чтобы остановить его.Поток прекращает работу, когда выходит из метода run.Посмотрите на приведенный ниже пример

import time
import tkinter as tk
from threading import Thread

class MyThread(Thread):
    thread_running = False

    def run(self):
        k = 0
        self.thread_running = True
        while self.thread_running:
            print(k)
            k +=1
            time.sleep(1)
        print("thread ended")

    def stop(self):
        self.thread_running = False


class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.thread = None

        tk.Button(self, text="launch thread", command=self.launch_thread)\
            .grid(row=1, column=0)
        tk.Button(self, text="stop thread", command=self.stop_thread)\
            .grid(row=2, column=0)

    def launch_thread(self):
        if self.thread:
            print("thread already launched")
        else:
            print("thread launched")
            self.thread = MyThread()
            self.thread.start()


    def stop_thread(self):
        if self.thread:
            self.thread.stop()
            self.thread = None
        else:
            print("no thread running")

if __name__ == '__main__':
    win = Window()
    win.mainloop()

См. Эту тему для получения дополнительной информации Есть ли способ убить тему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...