Я отображаю значения измерений сенсорного устройства с помощью приложения Tkinter GUI. Датчик отправляет новые данные каждую секунду. Я запустил новый поток, поместил результат в очередь и обработал очередь для отображения значений на GUI. Теперь я столкнулся с другой проблемой. Датчик имеет два режима работы. Для простоты я использовал генератор случайных чисел в программе. Пользователи должны иметь возможность переключать режимы с помощью двух кнопок. Кнопка-1 для режима-1, Кнопка-2 для режима-2. (скажем, операция в режиме 1 является случайной. странный (0,10), а операция в режиме 2 - случайной. и цифровой (100, 200). Как управлять этими двумя операциями с помощью потоков? Если пользователь начал операцию в режиме 1 , когда он нажимает кнопку-2, операция в режиме 1 должна прекратиться (нить-1) и должна начаться операция в режиме 2 (нить-2). Это означает, что мне нужно уничтожить нить-1? способ управления двумя режимами в одном потоке? Я совершенно новый в потоке. Любые предложения, пожалуйста.
import tkinter
import threading
import queue
import time
import random
class GuiGenerator:
def __init__(self, master, queue):
self.queue = queue
# Set up the GUI
master.geometry('800x480')
self.output = tkinter.StringVar()
output_label = tkinter.Label(master, textvariable= self.output)
output_label.place(x=300, y=200)
#I haven't shown command parts in following buttons. No idea how to use it to witch modes?
mode_1_Button = tkinter.Button(master, text = "Mode-1")
mode_1_Button.place(x=600, y=300)
mode_2_Button = tkinter.Button(master, text = "Mode-2")
mode_2_Button.place(x=600, y=400)
def processQueue(self):
while self.queue.qsize():
try:
sensorOutput = self.queue.get() #Q value
self.output.set(sensorOutput) #Display Q value on GUI
except queue.Empty:
pass
class ClientClass:
def __init__(self, master):
self.master = master
# Create the queue
self.queue = queue.Queue()
# Set up the GUI part
self.myGui = GuiGenerator(master, self.queue)
#How do I switch the modes of operations? do I need some flags setting through button press?
# Set up the thread to do asynchronous I/O
self.thread1_mode1 = threading.Thread(target=self.firstModeOperation)
self.thread1_mode1.start()
# Start the periodic call in the GUI to check if the queue contains
# anything new
self.periodicCall()
def periodicCall(self):
# Check every 1000 ms if there is something new in the queue.
self.myGui.processQueue()
self.master.after(1000, self.periodicCall)
def firstModeOperation(self):
while True: #??? how do i control here through mode selection
time.sleep(1.0)
msg_mode_1= random.randrange(0,10)
self.queue.put(msg_mode_1)
def secondModeOperation(self):
while True: #??? how do i control here through mode selection
time.sleep(1.0)
msg_mode_2= random.randrange(100,200)
self.queue.put(msg_mode_2)
#Operation part
root = tkinter.Tk()
client = ClientClass(root)
root.mainloop()