управление процессом python с помощью кнопок - Tkinter - PullRequest
0 голосов
/ 10 июля 2019

возможно ли управлять или изменять поток процессов с помощью кнопок python tkinter. У меня есть два класса. Один GuiClass и другой ClientClass. Я хочу начать процесс через нажатие кнопки запуска. и остановить процесс, нажав кнопку остановки. Я знаю, как это сделать, когда нет занятий. Но как составная часть ClientClass от GuiClass, я не знаю, как это сделать. Мой процесс - генерация случайных значений. но в более позднем случае я буду использовать его для получения данных измерений датчика каждую секунду, и я отображаю эти данные в моем графическом интерфейсе. (Я задавал тот же вопрос раньше, никаких ответов. Поэтому я упростил свой вопрос :)

class GuiClass:
    def __init__(self, master, queue, endCommand, startCommand, stopCommand ):
        self.queue = queue
        self.radnom_value_var = tkinter.StringVar()
        # Set up the GUI
        Random_Value = tkinter.Label(master, text = "Value")
        Random_Value.grid(row=2)

        Random_Value_display = tkinter.Label(master, textvariable = self.radnom_value_var)
        Random_Value_display.grid(row=4)

#buttons
        console_end = tkinter.Button(master, text='Done', command=endCommand)
        console_end.grid(row=11)

        start_button = tkinter.Button(master, text='Start', command=startCommand)
        start_button.grid(row=5)

        stop_button = tkinter.Button(master, text='Stop', command=stopCommand)
        stop_button.grid(row=6)


    def processIncoming(self):
        """
        Handle all the messages currently in the queue (if any).
        """
        while self.queue.qsize():
            try:
                msg = self.queue.get(0)
                # Check contents of q message 
                print (msg)
                self.radnom_value_var.set(msg)

            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.gui = GuiClass(master, self.queue, self.endApplication, self.start_Command, self.stop_Command)

        self.start_status  = 1    #-------do i need this?  or what do i need here?
        self.running = 1
        self.thread1 = threading.Thread(target=self.workerThread1)  # or can i create different thread based on button pressing?
        self.thread1.start()
        # Start the periodic call in the GUI to check if the queue contains
        # anything
        self.periodicCall()

    def periodicCall(self):
        if self.running==1:    #because of this program start when i run the code. but i want is it wait for start button press
            self.gui.processIncoming()
        if self.running==0:
            import sys
            sys.exit(1)
        self.master.after(1000, self.periodicCall)

    def workerThread1(self):
        while self.running==1:
            time.sleep(1)
            msg = rand.random()
            self.queue.put(msg)
'''
i tried something like this. not successfull `
def workerThread1(self):
        while self.start_status == 1 and self.running!=0 :
            time.sleep(1)
            msg = rand.random()
            self.queue.put(msg)
            print("start status ")
        while self.stop_status = =1and self.running!=0:
            time.sleep(1)
            print("stop )
'''

    def endApplication(self):
        self.running = 0
    def start_Command(self):
        self.start_status = 1
    def stopCommand(self):
        self.stop_status = 1
rand = random.Random()
root = tkinter.Tk()
client = ClientClass(root)
root.mainloop()

1 Ответ

0 голосов
/ 11 июля 2019

Использование классов действительно не делает это более сложным. Каждый экземпляр класса должен содержать ссылку на другой.

Например, ваш ClientClass уже передает такие вещи, как очередь и главный виджет. Вместо того, чтобы передавать эти вещи, оно может пройти само по себе Затем графический интерфейс может напрямую ссылаться на методы и флаги клиента.

Например:

class ClientClass():
    def __init__(...):
        ...
        self.gui = GuiClass(..., client=self)
        ...


class GuiClass:
    def __init__(..., client):
        self.client = client
        ...
        console_end = tkinter.Button(..., command=self.client.endCommand)
        start_button = tkinter.Button(..., command=self.client.startCommand)
        stop_button = tkinter.Button(..., command=self.client.stopCommand)

С учетом вышесказанного клиент узнает о графическом интерфейсе (self.gui), а графический интерфейс пользователя узнает о клиенте (self.client). Это разрешает двустороннюю связь, поскольку каждый экземпляр может вызывать методы и получать атрибуты от другого.

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