[英]Make a Tkinter Toplevel active
我正在嘗試制作一個Toplevel
小部件,它是屏幕上的活動窗口(我想要它,以便如果您按Enter ,它會退出窗口。我已經將鍵綁定到小部件,但我似乎無法獲得將窗口作為我計算機上的主窗口。我正在使用 Notepad++ 運行我的程序(我有這個特定程序的快捷方式,因為我會經常使用它)。
這是我的代碼:
def main():
root = Tk(className = ' Module Opener')
app = GetFileName(root)
root.rowconfigure(0, weight = 1)
root.columnconfigure(0, weight = 1)
root.bind('<Return>', (lambda e, b=app.goButton: b.invoke()))
root.mainloop()
f, pythonType = app.fileName, app.pythonType
if f[-3:] != '.py': f += '.py'
moduleFile = getFilePath(f, pythonType)
if not moduleFile is None:
subprocess.call([r"C:\Program Files\Notepad++\notepad++.exe", moduleFile])
else:
root.withdraw()
finalRoot = Toplevel(root)
finalRoot.grab_set() # I thought this would make it active
finalApp = FileNotExist(finalRoot, f)
finalRoot.rowconfigure(0, weight = 1)
finalRoot.columnconfigure(0, weight = 1)
finalRoot.bind('<Return>', (lambda e, b=finalApp.okButton: b.invoke()))
finalRoot.mainloop()
我想要它,當它打開時,如果我按下Enter ,它會執行我的命令; 但是,我必須先在窗口中單擊以使其處於活動狀態,然后才能正常工作。
我嘗試了各種方法,例如finalRoot.lift()
、 finalRoot.focus_set()
、 finalRoot.grab_set()
/ finalRoot.grab_set_global()
(我從另一個問題中看到了這些方法)和finalRoot.focus()
。
當程序啟動時,第一個窗口Tk()
處於活動狀態。 但是, Toplevel()
不是。 我還嘗試制作兩個Tk()
的(銷毀root
然后創建finalRoot
作為一個新的Tk()
實例),但這並沒有奏效。 我怎樣才能做到這一點? 謝謝!
...但是,我必須先在窗口中單擊以使其處於活動狀態,然后才能正常工作。
我剛遇到這個問題,在研究解決方案時,我發現了這個線程。 我正在使用 Windows 7 專業版。 我所做的只是調用了grab_set()
和focus()
,它為我解決了這個問題。 您已經有了finalRoot.grab_set()
,只需添加:
finalRoot.focus()
它在我的情況下有效。
我嘗試了上述解決方案,發現focus_force()
單獨適用於 Windows Vista/Python 3.3。 此外,在創建 Toplevel 窗口時包含takefocus=True
方法可能會有所幫助。
我遇到了同樣的問題,並嘗試了我能找到的一切。 不幸的是,答案是這取決於您的操作系統。 我的窗口會自動聚焦在我的舊 Mac 上,但不會聚焦在 OSX Lion 上。 您列出的一些命令也依賴於操作系統。
以上建議均不適用於 Mac OS El Capitan,但這確實適用:
class Window(Tk.Toplevel):
...
def setActive(self):
self.lift()
self.focus_force()
self.grab_set()
self.grab_release()
...
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
root.focus_force()
這是對我有用的代碼
root= tk.Tk()
root.title("Main Window")
top = tk.Toplevel()
top.title("Topelevel Window")
top.grab_set() #for disable main window
top.attributes('-topmost',True) #for focus on toplevel
root.mainloop()
我在這里為時已晚,但是如果有人想知道python 3.9
的解決方案,只需使用focus()
。
所以,
top_window_name.focus()
而已。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.