Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Unwanted window spawns when using Tkinter with multiprocessing.

1,139 views
Skip to first unread message

altern...@rocketmail.com

unread,
Apr 28, 2013, 2:33:21 PM4/28/13
to
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 ?

Dave Angel

unread,
Apr 28, 2013, 5:18:52 PM4/28/13
to pytho...@python.org
On 04/28/2013 02:33 PM, altern...@rocketmail.com wrote:
> 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 ?
>

If you can't post in clear English, then give us some other clues to
compensate. Could you post some code, define some function names, and
use fewer pronouns and indirection?

for example: "it spawns new windows" -- What spawns new windows, exactly?


--
DaveA

altern...@rocketmail.com

unread,
Apr 28, 2013, 6:23:21 PM4/28/13
to
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.

Dave Angel

unread,
Apr 28, 2013, 7:10:17 PM4/28/13
to pytho...@python.org
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?


--
DaveA

altern...@rocketmail.com

unread,
Apr 28, 2013, 7:40:02 PM4/28/13
to
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.

Dave Angel

unread,
Apr 28, 2013, 8:24:22 PM4/28/13
to pytho...@python.org
On 04/28/2013 07:40 PM, altern...@rocketmail.com wrote:
> 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.

> at least not on purpose. I'm running on Windows 7 64 bits.
>


--
DaveA

Chris Angelico

unread,
Apr 28, 2013, 11:03:59 PM4/28/13
to pytho...@python.org
On Mon, Apr 29, 2013 at 9:40 AM, <altern...@rocketmail.com> wrote:
> 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.

Using multiprocessing on Windows has some requirements:

http://docs.python.org/2/library/multiprocessing.html#windows

If you take care of those restrictions, you should be able to do this.
As Dave pointed out, one of the requirements is for your module to be
importable.

ChrisA

altern...@rocketmail.com

unread,
Apr 29, 2013, 11:31:50 AM4/29/13
to
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.

MRAB

unread,
Apr 29, 2013, 1:03:10 PM4/29/13
to pytho...@python.org
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'

altern...@rocketmail.com

unread,
Apr 29, 2013, 1:32:16 PM4/29/13
to
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 ?

Chris Angelico

unread,
Apr 29, 2013, 1:45:01 PM4/29/13
to pytho...@python.org
On Tue, Apr 30, 2013 at 3:32 AM, <altern...@rocketmail.com> wrote:
> 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

altern...@rocketmail.com

unread,
Apr 29, 2013, 2:44:04 PM4/29/13
to
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.

Chris Angelico

unread,
Apr 29, 2013, 6:00:24 PM4/29/13
to pytho...@python.org
On Tue, Apr 30, 2013 at 4:44 AM, <altern...@rocketmail.com> wrote:
> 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.

I don't know what you mean by your "clause", and I think we have a
language barrier here. (Though your English is *way* better than my
French.) But for a simple rule of thumb, the only things you should
have flush left are "def" and "class" statements, and the one "if"
that checks __name__. Everything else should be indented.

Chris Angelico

altern...@rocketmail.com

unread,
Apr 29, 2013, 9:17:06 PM4/29/13
to
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.

Dave Angel

unread,
Apr 29, 2013, 10:05:17 PM4/29/13
to pytho...@python.org
On 04/29/2013 09:17 PM, altern...@rocketmail.com wrote:
> 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.

--
DaveA

altern...@rocketmail.com

unread,
Apr 30, 2013, 8:22:18 AM4/30/13
to
> 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)


Dave Angel

unread,
Apr 30, 2013, 8:30:27 AM4/30/13
to pytho...@python.org
And you're still getting a new window ? Wow!


--
DaveA

altern...@rocketmail.com

unread,
Apr 30, 2013, 8:31:56 AM4/30/13
to
> Dave A.

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