簡體   English   中英

激活 Tkinter Toplevel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM