В настоящее время я разрабатываю программу с графическим интерфейсом для сбора данных с датчика и их визуализации в графическом интерфейсе.Данные от датчика сохраняются в списке для дальнейших расчетов.
То, что я сейчас пытаюсь сделать, - это запустить процесс регистрации в новом потоке.Это должно остановить графический интерфейс от зависания.
Мой текущий код:
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