Unwanted window spawns when using Tkinter with multiprocessing.

A

alternative00

Hi everyone,

I'm trying to use multiprocessing to avoid Python's GIL but with Tkinter, instead of running my main function, it spawns new windows. In fact, my fuction is used everytime I press a specified key, but with multiprocessing I only get a new window when I hit a key. Does anyone have a solution ?
 
A

alternative00

Sorry for my bad english.

Here's my code :

def key(event):

instance = 'Instance'
touche = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()



def player(hitkey):


winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)

'key' is the tkinter function wich gets the pressed key.
'player' is the function playing a specific wav file depending on wich key is pressed, that's why its argument is 'hitkey'. It uses the winsound module.

What spawns new windows is theorically the multiprocessing line of code, even if it's inside the 'key' function.
 
D

Dave Angel

Sorry for my bad english.

Here's my code :

def key(event):

instance = 'Instance'
touche = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()



def player(hitkey):


winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)

'key' is the tkinter function wich gets the pressed key.
'player' is the function playing a specific wav file depending on wich key is pressed, that's why its argument is 'hitkey'. It uses the winsound module.

What spawns new windows is theorically the multiprocessing line of code, even if it's inside the 'key' function.

Do you have an

if __name__ == "__main__":

clause in your main script? Are you bypassing the gui event loop on the
secondary process? Otherwise, it's your code that's launching the extra
window.

And what OS are you running on?
 
A

alternative00

Well I saw this clause on most of the multiprocessing examples I saw but the reason it was here wasn't explained so I just ignored it (yeah stupid I know). I don't think I bypassed anything, at least not on purpose. I'm running on Windows 7 64 bits.
 
D

Dave Angel

Well I saw this clause on most of the multiprocessing examples I saw but the reason it was here wasn't explained so I just ignored it (yeah stupid I know). I don't think I bypassed anything,

Yes, you skipped the essential if clause.

The child process is started with a different __name__. So if the
__name__ is not "__main__", then you should NOT call any of the GUI
startup code.

Probably you should do little or nothing in the top-level code of the
child process. But we can't give specific advice without seeing what
that code now looks like. What code do you have at top level, and if it
calls functions, what do they look like?

The way you get that code to be different in the child is with that if
statement that you omitted.
 
A

alternative00

My full code is :


#Import
from tkinter import *
import wave
import winsound
import multiprocessing

#Initialisation
fenetre=Tk()
frame = Frame(fenetre, width=200, height=100)
instance = 'Instance'


#Fonctions

def key(event):

instance = 'Instance'
hitkey = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()



def player(hitkey):


winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)



#TK
frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()

The problem is that I don't know where to put that clause.
 
M

MRAB

My full code is :


#Import
from tkinter import *
import wave
import winsound
import multiprocessing

#Initialisation
fenetre=Tk()
frame = Frame(fenetre, width=200, height=100)
instance = 'Instance'


#Fonctions

def key(event):

instance = 'Instance'
hitkey = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()



def player(hitkey):


winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)



#TK
frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()

The problem is that I don't know where to put that clause.
I hope this helps:


#Import
from tkinter import *
import wave
import winsound
import multiprocessing


#Fonctions

def key(event):
instance = 'Instance'
hitkey = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()


def player(hitkey):
winsound.PlaySound(hitkey + '.wav',
winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)


if __name__ == "__main__":
# This part will be run if the file is run as the main script.
#
# The multiprocessing module will import this file to run the
# "player" function, but __name__ won't be "__main__" when it does
# so, therefore this bit of code won't be run.

#Initialisation
fenetre = Tk()
frame = Frame(fenetre, width=200, height=100)
instance = 'Instance'

#TK
frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()
 
A

alternative00

It definetly helped, windows don't pop up anymore, but now it doesn't make any sound anymore. Could it be because of a local (non-global) variable ?
 
C

Chris Angelico

It definetly helped, windows don't pop up anymore, but now it doesn't make any sound anymore. Could it be because of a local (non-global) variable ?

Did you read what I linked you to? There are rules to using
multiprocessing; more of them on Windows.

ChrisA
 
A

alternative00

Yeah I did, but I globalized my variables, I've got only functions, and not methods, and my clause seems to work so I don't know why it doesn't work.
 
A

alternative00

I thought 'clause' was reffering to the 'if __name__ == "__main__":' thing in English, but apparently not.
Well except the import and the 'globalization' of my variables, every thing is idented.
 
D

Dave Angel

I thought 'clause' was reffering to the 'if __name__ == "__main__":' thing in English, but apparently not.
Well except the import and the 'globalization' of my variables, every thing is idented.

No clue whom you think you're replying to, but all your replies so far
are appearing in the thread as replies to your OP. Please use a little
context from the message you think you're responding to, so we have an
idea what you're talking about.

Did you ever see MRAB's message, where he told you exactly what the
change requested was?


if __name__ == "__main__":
# This part will be run if the file is run as the main script.
#
# The multiprocessing module will import this file to run the
# "player" function, but __name__ won't be "__main__" when it does
# so, therefore this bit of code won't be run.

#Initialisation
fenetre = Tk()
frame = Frame(fenetre, width=200, height=100)
instance = 'Instance'

#TK
frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()

All of those lines were at the left margin in your earlier posted code,
and you give us no reason to expect you've made them conditional.
 
A

alternative00

Dave A.

Yeah I'm using MRAB's code, my current code is :


#Initalisation
global event
global hitkey


#Functions
def key(event):

hitkey = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()


def player(hitkey):
winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)


if __name__ == "__main__":


fenetre = Tk()
frame = Frame(fenetre, width=200, height=100)


frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()
 
D

Dave Angel

Yeah I'm using MRAB's code, my current code is :


#Initalisation
global event
global hitkey


#Functions
def key(event):

hitkey = event.char
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()


def player(hitkey):
winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)


if __name__ == "__main__":


fenetre = Tk()
frame = Frame(fenetre, width=200, height=100)


frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()

And you're still getting a new window ? Wow!
 
A

alternative00

Dave A.

No, not a new window, but my player function doesn't play any sound anymore.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top