Unwanted window spawns when using Tkinter with multiprocessing.

Discussion in 'Python' started by alternative00@rocketmail.com, Apr 28, 2013.

  1. Guest

    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 ?
    , Apr 28, 2013
    #1
    1. Advertising

  2. Guest

    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.
    , Apr 28, 2013
    #2
    1. Advertising

  3. Dave Angel Guest

    On 04/28/2013 06:23 PM, wrote:
    > 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?


    --
    DaveA
    Dave Angel, Apr 29, 2013
    #3
  4. Guest

    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.
    , Apr 29, 2013
    #4
  5. Dave Angel Guest

    On 04/28/2013 07:40 PM, 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
    Dave Angel, Apr 29, 2013
    #5
  6. Guest

    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.
    , Apr 29, 2013
    #6
  7. MRAB Guest

    On 29/04/2013 16:31, wrote:
    > 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()
    MRAB, Apr 29, 2013
    #7
  8. Guest

    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 ?
    , Apr 29, 2013
    #8
  9. On Tue, Apr 30, 2013 at 3:32 AM, <> 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
    Chris Angelico, Apr 29, 2013
    #9
  10. Guest

    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.
    , Apr 29, 2013
    #10
  11. Guest

    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.
    , Apr 30, 2013
    #11
  12. Dave Angel Guest

    On 04/29/2013 09:17 PM, 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
    Dave Angel, Apr 30, 2013
    #12
  13. Guest

    > 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()
    , Apr 30, 2013
    #13
  14. Dave Angel Guest

    On 04/30/2013 08:22 AM, wrote:
    > > 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()
    >


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


    --
    DaveA
    Dave Angel, Apr 30, 2013
    #14
  15. Guest

    > Dave A.

    No, not a new window, but my player function doesn't play any sound anymore.
    , Apr 30, 2013
    #15
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Patrick L. Nolan
    Replies:
    0
    Views:
    340
    Patrick L. Nolan
    Dec 18, 2003
  2. Clara
    Replies:
    6
    Views:
    571
    Clara
    Apr 25, 2005
  3. Unwanted window

    , Oct 11, 2006, in forum: ASP .Net
    Replies:
    5
    Views:
    402
  4. Kevin Walzer
    Replies:
    2
    Views:
    549
    Kevin Walzer
    Aug 14, 2011
  5. Nathan Craddock

    Web Reference class spawns temporary assembly when instantiated?

    Nathan Craddock, Oct 7, 2005, in forum: ASP .Net Web Services
    Replies:
    1
    Views:
    129
    Nathan C.
    Oct 13, 2005
Loading...

Share This Page