Tkinter主窗口焦点

Pyt*_*You 14 python focus tkinter

我有以下代码

window = Tk()
window.lift()
window.attributes("-topmost", True)
Run Code Online (Sandbox Code Playgroud)

这段代码的工作原理是它在所有其他窗口上方显示我的Tkinter窗口,但它仍然只解决了一半的问题.虽然窗口实际上显示在所有其他窗口之上,但窗口没有焦点.有没有办法不仅让窗口成为​​Tkinter的最前面的窗口,而且还把重点放在它上面?

Bri*_*ler 9

如果focus_force()不工作,你可以尝试:

window.after(1, lambda: window.focus_force())
Run Code Online (Sandbox Code Playgroud)

它本质上是相同的,只是用不同的方式写的.我刚刚在python 2.7上测试过它.

root.focus_force() 不行,但上面的方法做了.


Com*_*nse 7

Windows解决方案有些棘手-您不能只是从另一个窗口中抢走焦点,而应以某种方式将应用程序移到前台。但是首先,我建议您花一点点Windows理论,以便我们能够确认这就是我们想要实现的目标。

正如我在评论中提到的-这是使用SetForegroundWindow函数的好机会(也请检查限制!)。但是,由于用户“拥有”前台,因此将这些东西视为廉价的黑客,Windows会竭尽全力阻止您:

当用户使用另一个窗口时,应用程序无法将窗口强制到前台。而是,Windows闪烁窗口的任务栏按钮以通知用户。

另外,请检查页面上的备注:

如果用户按下ALT键或采取了某些措施使系统本身更改了前景窗口(例如,单击背景窗口),则系统会自动启用对SetForegroundWindow的调用。

这是最简单的解决方案,因为我们能够模拟Alt印刷机:

import tkinter as tk
import ctypes

#   store some stuff for win api interaction
set_to_foreground = ctypes.windll.user32.SetForegroundWindow
keybd_event = ctypes.windll.user32.keybd_event

alt_key = 0x12
extended_key = 0x0001
key_up = 0x0002


def 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 stolen
window.after(2000, steal_focus)

window.mainloop()
Run Code Online (Sandbox Code Playgroud)

一些链接和示例:


Tar*_*ani 5

不确定您面临什么问题。但下面是对我很有用的示例代码。

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()
Run Code Online (Sandbox Code Playgroud)

这是在 Windows 10 上使用最新的 Python 3.6 测试的。

检测结果

结果是,运行程序后,我可以开始输入,他输入会转到第一个文本框


dta*_*sev 5

注意:这是 Windows 特定的。这将聚焦整个主窗口。本质上是强制 alt-tab 到达窗口。


这些答案都不适合我,tk窗口将出现在带有标志的所有内容之上-topmost,我的输入框将具有焦点,但窗口本身不会,这意味着键入不会出现在窗口中tk。它看起来像这样:

在此输入图像描述

有用的是添加对 Windows API 的调用来窃取焦点:

import win32gui    
root = tk.Tk()

# Application specific setup ...

win32gui.SetForegroundWindow(root.winfo_id())
Run Code Online (Sandbox Code Playgroud)

免责声明:窃取焦点是不好的行为,因此只有在必要且有意义的情况下才使用它,例如用户将立即输入的输入框。