Pyt*_*You 14 python focus tkinter
我有以下代码
window = Tk()
window.lift()
window.attributes("-topmost", True)
Run Code Online (Sandbox Code Playgroud)
这段代码的工作原理是它在所有其他窗口上方显示我的Tkinter窗口,但它仍然只解决了一半的问题.虽然窗口实际上显示在所有其他窗口之上,但窗口没有焦点.有没有办法不仅让窗口成为Tkinter的最前面的窗口,而且还把重点放在它上面?
如果focus_force()不工作,你可以尝试:
window.after(1, lambda: window.focus_force())
Run Code Online (Sandbox Code Playgroud)
它本质上是相同的,只是用不同的方式写的.我刚刚在python 2.7上测试过它.
root.focus_force() 不行,但上面的方法做了.
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)
一些链接和示例:
不确定您面临什么问题。但下面是对我很有用的示例代码。
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 测试的。
结果是,运行程序后,我可以开始输入,他输入会转到第一个文本框
注意:这是 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)
免责声明:窃取焦点是不好的行为,因此只有在必要且有意义的情况下才使用它,例如用户将立即输入的输入框。
| 归档时间: |
|
| 查看次数: |
13324 次 |
| 最近记录: |