मेरे पास एक जीयूआई एप्लीकेशन है। इसमें एक से अधिक खिड़कियाँ हैं। मुख्य विंडो हर सेकेंड को नए मानों के साथ अपडेट कर रही है। मैं यहां थ्रेडिंग और कतार का उपयोग कर रहा हूं। मुख्य विंडो में एक बटन है। इसे दबाने पर एक नई विंडो खुलेगी। मैं जो चाहता हूं, जब नई विंडो दिखाई जाती है, तो मुख्य विंडो में प्रक्रिया को रोकें (मान प्रक्रिया को अपडेट करना) और नई विंडो में कुछ नई प्रक्रिया दिखाई जाएगी। नई विंडो को बंद करने से मुख्य विंडो को फिर से रद्द कर देना चाहिए और प्रक्रिया जारी रखनी चाहिए। क्या मुझे मल्टी थ्रेडिंग या मल्टी प्रोसेसिंग का उपयोग करने की आवश्यकता है? दुर्भाग्य से, मैं यह प्रश्न दूसरी बार पूछ रहा हूँ। उसके लिए खेद है।

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()
0
dayDreamer 9 जुलाई 2019, 15:37

1 उत्तर

सबसे बढ़िया उत्तर

आप अपना कार्य 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
1
Henry Yik 10 जुलाई 2019, 07:26