Tkinter main window focus Tkinter main window focus tkinter tkinter

Tkinter main window focus


If focus_force() is not working you can try doing:

window.after(1, lambda: window.focus_force())

It's essentially the same thing, just written differently. I just tested it on python 2.7.

root.focus_force() wouldn't work but the above method did.


Solution for Windows is a littlebit tricky - you can't just steal the focus from another window, you should move your application to foreground somehow.But first, I suggest you to consume a littlebit of windows theory, so we're able to confirm, that this is what we want to achieve.

As I mentioned in comment - it's a good opportunity to use the SetForegroundWindow function (check restrictions too!). But consider such stuff as a cheap hack, since user "owns" foreground, and Windows would try to stop you at all cost:

An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.

Also, check a remark on this page:

The system automatically enables calls to SetForegroundWindow if the user presses the ALT key or takes some action that causes the system itself to change the foreground window (for example, clicking a background window).

Here's goes a simplest solution, since we're able to emulate Alt press:

import tkinter as tkimport ctypes#   store some stuff for win api interactionset_to_foreground = ctypes.windll.user32.SetForegroundWindowkeybd_event = ctypes.windll.user32.keybd_eventalt_key = 0x12extended_key = 0x0001key_up = 0x0002def steal_focus():    keybd_event(alt_key, 0, extended_key | 0, 0)    set_to_foreground(window.winfo_id())    keybd_event(alt_key, 0, extended_key | key_up, 0)    entry.focus_set()window = tk.Tk()entry = tk.Entry(window)entry.pack()#   after 2 seconds focus will be stolenwindow.after(2000, steal_focus)window.mainloop()

Some links and examples:


Not sure what issue you face. But below is sample code which worked great for me.

from tkinter import *window = Tk()def handle_focus(event):    if event.widget == window:        window.focus_set()        input1.focus_set()label1 = Label(window,text = "Enter Text 2")input1 = Entry(window, bd=5)label2 = Label(window,text = "Enter Text 2")input2 = Entry(window, bd=5)submit = Button(window, text="Submit")label1.pack()input1.pack()label2.pack()input2.pack()submit.pack(side=BOTTOM)window.lift()window.attributes("-topmost", True)window.bind("<FocusIn>", handle_focus)hwnd = window.winfo_id()window.mainloop()

This was tested using Latest Python 3.6 on Windows 10.

Test Results

The result was that after running the program, I could just start typing and and he input would go to the first text box