Python Tkinter - более одного окна, чтобы показать и сделать разные процессы - PullRequest
0 голосов
/ 09 июля 2019

У меня есть приложение с графическим интерфейсом.У него более одного окна.Главное окно обновляется каждую секунду с новыми значениями.Я использую многопоточность и очередь здесь.В главном окне есть кнопка.Нажатие на него откроет новое окно.Я хочу, чтобы при отображении нового окна остановите процесс в главном окне (обновляя процесс значений), и в новом окне будет показан новый процесс.Закрытие нового окна должно снова отозвать главное окно и продолжить процесс.Нужно ли использовать многопоточность или многопоточность?К сожалению, я задаю этот вопрос во второй раз.простите за это.

import tkinter
import time
import threading
import random
import queue

class GuiPart:
    def __init__(self, master, queue, endCommand,newWindow):
        self.queue = queue
        self.pause = False
        # Set up the GUI
        console = tkinter.Button(master, text='Done', command=endCommand)
        console.pack()

        console2 = tkinter.Button(master, text='New', command=newWindow)
        console2.pack()

        self.output = tkinter.StringVar()
        #output.set(1)
        output_1_label = tkinter.Label(master, textvariable= self.output, height=2, width=12)
        output_1_label.pack()
        # Add more GUI stuff here
        self.temp_process()

    def temp_process(self):
        if not self.pause:
            print ("handling messages")
        else:
            print ("Not handling messages")
        root.after(1000,self.temp_process)


    def processIncoming(self):
        while self.queue.qsize():
            try:
                msg = self.queue.get(0)
                print (msg)
                self.output.set(msg)
            except queue.Empty:
                pass

class ThreadedClient:

    def __init__(self, master):
        self.master = master

        # Create the queue
        self.queue = queue.Queue()

        # Set up the GUI part
        self.gui = GuiPart(master, self.queue, self.endApplication,self.create_window)

        self.running = 1
        self.thread1 = threading.Thread(target=self.workerThread1)  #this is for sending data to queue.
# what about second window?
        self.thread1.start()
        self.periodicCall()

    def on_quit(self):
        self.gui.pause = False
        self.window.destroy()

    def create_window(self):
        self.window = tkinter.Toplevel(root)
        self.gui.pause = True
        self.window.protocol("WM_DELETE_WINDOW",self.on_quit)

    def periodicCall(self):
        self.gui.processIncoming()
        if not self.running:
            import sys
            sys.exit(1)
        self.master.after(1000, self.periodicCall)

    def workerThread1(self):
        while self.running:
            time.sleep(rand.random() * 1)
            msg = rand.random()
            self.queue.put(msg)

    def endApplication(self):
        self.running = 0
rand = random.Random()
root = tkinter.Tk()
client = ThreadedClient(root)
root.mainloop()

1 Ответ

1 голос
/ 10 июля 2019

Вы можете настроить свою функцию processIncoming на проверку флага и при необходимости приостановить / возобновить.

class GuiPart:
    def __init__(self, master, queue, endCommand,newWindow):
        self.queue = queue
        self.pause = False
        ....

    def processIncoming(self):
        while self.queue.qsize() and not self.pause:
            try:
                msg = self.queue.get(0)
                print (msg)
                self.output.set(msg)
            except queue.Empty:
                pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...