Python tkinter - заправка нажатием кнопки - PullRequest
0 голосов
/ 07 апреля 2020

Я отображаю значения измерений сенсорного устройства с помощью приложения 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()

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