New Tkinter windows don't get focus on OS X

Discussion in 'Python' started by Joshua Bronson, Sep 10, 2009.

  1. If you try something like:

    $ python -m Tkinter -c 'Tkinter._test()'

    in Terminal on OS X, you'll notice that the window that is spawned
    does not get focus, rather focus remains in Terminal. Furthermore, if
    you hit Command+Tab to switch focus to the Python process, you'll
    notice that for some reason Python has been placed last in the focus
    order, even though it was just spawned by Terminal. This is
    undesirable if you're e.g. making a game where stuff happens as soon
    as the window is spawned and the player is expected to respond quickly
    but can't until she Command+Tabs over or clicks in the unfocused
    window. I've googled for this extensively and haven't found a way
    around it, so I thought I'd ask here. If there is a more appropriate
    place to ask, please let me know.

    Thanks,
    Josh
     
    Joshua Bronson, Sep 10, 2009
    #1
    1. Advertising

  2. Joshua Bronson

    Kevin Walzer Guest

    On 9/10/09 1:27 AM, Joshua Bronson wrote:
    > If you try something like:
    >
    > $ python -m Tkinter -c 'Tkinter._test()'
    >
    > in Terminal on OS X, you'll notice that the window that is spawned
    > does not get focus, rather focus remains in Terminal. Furthermore, if
    > you hit Command+Tab to switch focus to the Python process, you'll
    > notice that for some reason Python has been placed last in the focus
    > order, even though it was just spawned by Terminal. This is
    > undesirable if you're e.g. making a game where stuff happens as soon
    > as the window is spawned and the player is expected to respond quickly
    > but can't until she Command+Tabs over or clicks in the unfocused
    > window. I've googled for this extensively and haven't found a way
    > around it, so I thought I'd ask here. If there is a more appropriate
    > place to ask, please let me know.
    >
    > Thanks,
    > Josh



    Yes, this is standard behavior for OS X. Running an app in Terminal
    keeps focus in the Terminal unless you switch by clicking windows. The
    Command-Tab behavior is determined by the windowing system, not by a
    newly spawned process.

    The way around this is to wrap your application up in a standard Mac app
    bundle using py2app. The average Mac user isn't going to launch a
    Python-based game from the command line.

    Kevin



    --
    Kevin Walzer
    Code by Kevin
    http://www.codebykevin.com
     
    Kevin Walzer, Sep 10, 2009
    #2
    1. Advertising

  3. Hey Kevin,

    Thanks for your quick reply.

    On Sep 10, 10:12 am, Kevin Walzer <> wrote:
    > On 9/10/09 1:27 AM, Joshua Bronson wrote:
    > > If you try something like:

    >
    > > $ python -m Tkinter -c 'Tkinter._test()'

    >
    > > in Terminal on OS X, you'll notice that the window that is spawned
    > > does not get focus, rather focus remains in Terminal. Furthermore, if
    > > you hit Command+Tab to switch focus to the Python process, you'll
    > > notice that for some reason Python has been placed last in the focus
    > > order, even though it was just spawned by Terminal. This is
    > > undesirable if you're e.g. making a game where stuff happens as soon
    > > as the window is spawned and the player is expected to respond quickly
    > > but can't until she Command+Tabs over or clicks in the unfocused
    > > window. I've googled for this extensively and haven't found a way
    > > around it, so I thought I'd ask here. If there is a more appropriate
    > > place to ask, please let me know.

    >
    > > Thanks,
    > > Josh

    >
    > Yes, this is standard  behavior for OS X. Running an app in Terminal
    > keeps focus in the Terminal unless you switch by clicking windows.


    At first I was puzzled by this, because if you run something like
    "open -a TextEdit", TextEdit gets the focus. But then I realized this
    must be because of the "open" command. Indeed, if you try running
    something like "/Applications/MacPorts/Python\ 2.6/IDLE.app/Contents/
    MacOS/IDLE" focus will remain in Terminal.

    On the other hand, every other GUI toolkit I've used (e.g. wxPython,
    PyQt4, pyglet) does not have this problem. (If you try the basic
    example from http://www.wxpython.org/tut-part1.php you'll see what I
    mean.) How are these other toolkits able to steal the focus? More
    important, is it *possible* to have a Tkinter app steal the focus,
    even if it's not the default behavior?

    > The Command-Tab behavior is determined by the windowing system, not
    > by a newly spawned process.


    Sure, but I've always noticed a correspondence between the focus order
    and the order in which an application was spawned. So the conclusion
    is that there's just a system-wide inconsistency here in the case of
    spawning GUI apps from Terminal.

    > The way around this is to wrap your application up in a standard Mac app
    > bundle using py2app. The average Mac user isn't going to launch a
    > Python-based game from the command line.


    True, but it'll still be a lot less painful for me to test my app if I
    can get it to steal focus
    when launched from the command line. If anyone knows how to do this in
    Tkinter, help would be much appreciated.

    Thanks,
    Josh

    > Kevin
    >
    > --
    > Kevin Walzer
     
    Joshua Bronson, Sep 10, 2009
    #3
  4. Joshua Bronson

    Kevin Walzer Guest

    Hi Joshua,

    > At first I was puzzled by this, because if you run something like
    > "open -a TextEdit", TextEdit gets the focus. But then I realized this
    > must be because of the "open" command. Indeed, if you try running
    > something like "/Applications/MacPorts/Python\ 2.6/IDLE.app/Contents/
    > MacOS/IDLE" focus will remain in Terminal.


    OK...

    >
    > On the other hand, every other GUI toolkit I've used (e.g. wxPython,
    > PyQt4, pyglet) does not have this problem. (If you try the basic
    > example from http://www.wxpython.org/tut-part1.php you'll see what I
    > mean.) How are these other toolkits able to steal the focus? More
    > important, is it *possible* to have a Tkinter app steal the focus,
    > even if it's not the default behavior?


    I've confirmed this with wx...not sure why Tk behaves differently.

    >
    >> The way around this is to wrap your application up in a standard Mac app
    >> bundle using py2app. The average Mac user isn't going to launch a
    >> Python-based game from the command line.

    >
    > True, but it'll still be a lot less painful for me to test my app if I
    > can get it to steal focus
    > when launched from the command line. If anyone knows how to do this in
    > Tkinter, help would be much appreciated.


    I'm not sure there's a way to do this.

    --Kevin

    --
    Kevin Walzer
    Code by Kevin
    http://www.codebykevin.com
     
    Kevin Walzer, Sep 10, 2009
    #4
  5. On Thursday 10 September 2009 18:19:09 Joshua Bronson wrote:

    > True, but it'll still be a lot less painful for me to test my app if I
    > can get it to steal focus
    > when launched from the command line. If anyone knows how to do this in
    > Tkinter, help would be much appreciated.
    >


    look for widget.focus_force()
    and look for widget.grab_set_global()

    Yahoo for: Shipman Tkinter "new mexico tech"
    for a nice manual, if you do not have it yet.

    HTH - Hendrik
     
    Hendrik van Rooyen, Sep 11, 2009
    #5
  6. Joshua Bronson

    eb303 Guest

    On Sep 11, 9:14 am, Hendrik van Rooyen <>
    wrote:
    > On Thursday 10 September 2009 18:19:09 Joshua Bronson wrote:
    >
    > > True, but it'll still be a lot less painful for me to test my app if I
    > > can get it to steal focus
    > > when launched from the command line. If anyone knows how to do this in
    > > Tkinter, help would be much appreciated.

    >
    > look for widget.focus_force()
    > and look for widget.grab_set_global()


    Doesn't work. BTW, forcing the focus or setting the grab globally are
    usually considered very annoying and I don't know any windowing system
    or window manager honouring those.

    For the OP: the problem comes from the tcl/tk level. Running a tcl
    script just opening a window from the terminal shows the same
    behaviour. You might want to forward the question to the tcl guys.
     
    eb303, Sep 11, 2009
    #6
  7. On Friday 11 September 2009 09:53:56 eb303 wrote:
    > On Sep 11, 9:14 am, Hendrik van Rooyen <>
    > wrote:


    > > look for widget.focus_force()
    > > and look for widget.grab_set_global()

    >
    > Doesn't work. BTW, forcing the focus or setting the grab globally are
    > usually considered very annoying and I don't know any windowing system
    > or window manager honouring those.


    I have to confess I have never used the stuff - just remembered seeing it in
    the manual and pointed it out.

    What does it do?

    - Hendrik
     
    Hendrik van Rooyen, Sep 11, 2009
    #7
  8. Joshua Bronson

    eb303 Guest

    On Sep 11, 10:40 am, Hendrik van Rooyen <>
    wrote:
    > On Friday 11 September 2009 09:53:56 eb303 wrote:
    >
    > > On Sep 11, 9:14 am, Hendrik van Rooyen <>
    > > wrote:
    > > > look for widget.focus_force()
    > > > and look for widget.grab_set_global()

    >
    > > Doesn't work. BTW, forcing the focus or setting the grab globally are
    > > usually considered very annoying and I don't know any windowing system
    > > or window manager honouring those.

    >
    > I have to confess I have never used the stuff - just remembered seeing it in
    > the manual and pointed it out.
    >
    > What does it do?


    At tcl level, focus_force() and grab_set_global() are translated as
    options to the equivalents of focus_set() and grab_set() [1][2]. If
    these are not honoured, the options are simply ignored. That's what
    seems to happen on Mac OS X. So focus_force() does the same as
    focus_set(), and grab_set_global() the same as grab_set(). No use for
    the OP's problem...

    [1] http://www.tcl.tk/man/tcl8.5/TkCmd/focus.htm
    [2] http://www.tcl.tk/man/tcl8.5/TkCmd/grab.htm
     
    eb303, Sep 11, 2009
    #8
  9. On Sep 11, 3:53 am, eb303 <> wrote:
    > For the OP: the problem comes from the tcl/tk level. Running a tcl
    > script just opening a window from the terminal shows the same
    > behaviour. You might want to forward the question to the tcl guys.


    Done:
    https://sourceforge.net/&forum_name=tcl-mac
     
    Joshua Bronson, Sep 15, 2009
    #9
    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. jalkadir
    Replies:
    2
    Views:
    405
  2. William McBrine
    Replies:
    0
    Views:
    322
    William McBrine
    May 28, 2008
  3. Hidekazu IWAKI
    Replies:
    1
    Views:
    417
    Peter Otten
    Dec 14, 2009
  4. Hidekazu IWAKI
    Replies:
    0
    Views:
    552
    Hidekazu IWAKI
    Dec 15, 2009
  5. Roger
    Replies:
    3
    Views:
    379
Loading...

Share This Page