2014-03-30 275 views
6

我有以下代碼Tkinter的主窗口焦點

window = Tk() 
window.lift() 
window.attributes("-topmost", True) 

此代碼的工作,它上面顯示所有其他窗口我Tkinter的窗口,但它仍然只是解決了問題的一半。雖然窗口實際上顯示在所有其他窗口之上,但窗口沒有焦點。有沒有一種方法可以使窗戶成爲Tkinter的最前面的窗戶,而且還將注意力集中在它上面?

+0

是什麼讓你覺得它沒有重點?你有沒有試過在窗口上調用'focus_force'? –

+1

我認爲它沒有焦點,因爲窗口是灰色的,我不得不點擊它來識別擊鍵,也'focus_force'不能解決問題 –

+0

@marczellm,你能指定問題嗎?我在Python 3.6和Windows 10上運行代碼,它的工作原理 –

回答

4

如果focus_force()不工作,你可以嘗試做:

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

它本質上是一樣的東西,只是有不同的寫法。我只是在python 2.7上測試它。

root.focus_force()不起作用,但上述方法。

+0

你使用的是什麼操作系統? (我在OSX上) –

+0

@PythonSpoilsYou對不起,對於遲到的回覆,但我在Windows上。我只是重新測試了這一點,它似乎只適用於一個代碼,但另一個沒有。 –

+0

你有什麼想法爲什麼? –

-1

不知道你面臨什麼問題。但下面是適用於我的很好的示例代碼。

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

Test Results

其結果是,運行該程序後,我可以開始輸入和他的投入將進入第一文本框

+0

我想要做的是我的應用程序(響應全局鍵盤事件或定時事件)從其他應用程序(例如Firefox)竊取焦點。 – marczellm

+0

@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

1

針對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() 

一些鏈接和例子: