我有以下代碼Tkinter的主窗口焦點
window = Tk()
window.lift()
window.attributes("-topmost", True)
此代碼的工作,它上面顯示所有其他窗口我Tkinter的窗口,但它仍然只是解決了問題的一半。雖然窗口實際上顯示在所有其他窗口之上,但窗口沒有焦點。有沒有一種方法可以使窗戶成爲Tkinter的最前面的窗戶,而且還將注意力集中在它上面?
我有以下代碼Tkinter的主窗口焦點
window = Tk()
window.lift()
window.attributes("-topmost", True)
此代碼的工作,它上面顯示所有其他窗口我Tkinter的窗口,但它仍然只是解決了問題的一半。雖然窗口實際上顯示在所有其他窗口之上,但窗口沒有焦點。有沒有一種方法可以使窗戶成爲Tkinter的最前面的窗戶,而且還將注意力集中在它上面?
如果focus_force()
不工作,你可以嘗試做:
window.after(1, lambda: window.focus_force())
它本質上是一樣的東西,只是有不同的寫法。我只是在python 2.7上測試它。
root.focus_force()
不起作用,但上述方法。
你使用的是什麼操作系統? (我在OSX上) –
@PythonSpoilsYou對不起,對於遲到的回覆,但我在Windows上。我只是重新測試了這一點,它似乎只適用於一個代碼,但另一個沒有。 –
你有什麼想法爲什麼? –
不知道你面臨什麼問題。但下面是適用於我的很好的示例代碼。
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()
這是使用最新的Python 3.6測試在Windows 10
其結果是,運行該程序後,我可以開始輸入和他的投入將進入第一文本框
我想要做的是我的應用程序(響應全局鍵盤事件或定時事件)從其他應用程序(例如Firefox)竊取焦點。 – marczellm
@marczellm,不幸的是,您的要求不是關於從另一個應用程序(至少取得勝利)竊取重點,而是關於替換一個[*前景*](https://msdn.microsoft.com/en-gb/library /windows/desktop/ms633539(v=vs.85).aspx)窗口(例如firefox)與另一個(你的tk應用程序)。這不是那麼簡單的任務,因爲它似乎是,所以這是一個[類似的問題](https://stackoverflow.com/questions/26323767/intercepting-a-windows-attempt-to-steal-global-focus-on-視窗)。 – CommonSense
針對Windows的解決方案有點棘手 - 您不能僅從另一個窗口竊取焦點,您應該將應用程序以某種方式移至前臺。 但首先,我建議你消費littlebit of windows theory,所以我們能夠確認,這是我們想要實現的。
正如我在comment中提到的那樣 - 這是使用SetForegroundWindow函數的一個好機會(也請檢查限制!)。但考慮這樣的東西作爲一種廉價的破解,因爲用戶「擁有」的前景,和Windows會試圖不惜一切代價阻止你:
應用程序無法強迫一個窗口到前臺當用戶正在與另一扇窗。相反,Windows會閃爍窗口的任務欄按鈕以通知用戶。
此外,檢查了一句話就this頁:
系統將自動啓用呼叫如果用戶按下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()
一些鏈接和例子:
是什麼讓你覺得它沒有重點?你有沒有試過在窗口上調用'focus_force'? –
我認爲它沒有焦點,因爲窗口是灰色的,我不得不點擊它來識別擊鍵,也'focus_force'不能解決問題 –
@marczellm,你能指定問題嗎?我在Python 3.6和Windows 10上運行代碼,它的工作原理 –