Stijn Van Daele
Stijn Van Daele

Reputation: 295

Multiprocessing - tkinter pipeline communication

I have a question on multiprocessing and tkinter. I am having some problems getting my process to function parallel with the tkinter GUI. I have created a simple example to practice and have been reading up to understand the basics of multiprocessing. However when applying them to tkinter, only one process runs at the time. (Using Multiprocessing module for updating Tkinter GUI) Additionally, when I added the queue to communicate between processes, (How to use multiprocessing queue in Python?), the process won't even start.

Goal: I would like to have one process that counts down and puts the values in the queue and one to update tkinter after 1 second and show me the values.

All advice is kindly appreciated

Kind regards, S

EDIT: I want the data to be available when the after method is being called. So the problem is not with the after function, but with the method being called by the after function. It will take 0.5 second to complete the calculation each time. Consequently the GUI is unresponsive for half a second, each second.

EDIT2: Corrections were made to the code based on the feedback but this code is not running yet.

class Countdown(): 
    """Countdown prior to changing the settings of the flows"""

    def __init__(self,q):

        self.master = Tk()
        self.label = Label(self.master, text="", width=10)
        self.label.pack()
        self.counting(q)

    # Countdown()
    def counting(self, q):
        try:
            self.i = q.get()
        except:
            self.label.after(1000, self.counting, q)

        if int(self.i) <= 0:
            print("Go")
            self.master.destroy()

        else:
            self.label.configure(text="%d" % self.i)
            print(i)
            self.label.after(1000, self.counting, q)

def printX(q):
    for i in range(10):
        print("test")
        q.put(9-i)
        time.sleep(1)
    return


if __name__ == '__main__':
    q = multiprocessing.Queue()

    n = multiprocessing.Process(name='Process2', target=printX, args = (q,)) 
    n.start() 

    GUI = Countdown(q)
    GUI.master.mainloop()

Upvotes: 5

Views: 669

Answers (3)

Stijn Van Daele
Stijn Van Daele

Reputation: 295

Multiprocessing does not function inside of the interactive Ipython notebook. Multiprocessing working in Python but not in iPython As an alternative you can use spyder.

Upvotes: 3

Noel Segura Meraz
Noel Segura Meraz

Reputation: 2323

You are calling wrong the after function. The second argument must be the name of the function to call, not a call to the function.

If you call it like

self.label.after(1000, self.counting(q))

It will call counting(q) and wait for a return value to assign as a function to call.

To assign a function with arguments the syntax is

self.label.after(1000, self.counting, q)

Also, start your second process before you create the window and call counting.

n = multiprocessing.Process(name='Process2', target=printX, args = (q,)) 
n.start() 

GUI = Countdown(q)
GUI.master.mainloop()

Also you only need to call mainloop once. Either position you have works, but you just need one


Edit: Also you need to put (9-i) in the queue to make it count down.

q.put(9-i)

Inside the printX function

Upvotes: 2

Bryan Oakley
Bryan Oakley

Reputation: 386372

No code will run after you call mainloop until the window has been destroyed. You need to start your other process before you call mainloop.

Upvotes: 2

Related Questions