使Tkinter的Toplevel窗口处于激活状态

5
我正在尝试创建一个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() 实例),但这也不起作用。请问该怎么做呢?谢谢!
7个回答

7
...然而,我必须先点击窗口使其变为活动状态,然后它才能正常工作。
我刚遇到了这个问题,在研究解决方案时,我发现了这个帖子。我正在使用Windows 7 Professional。我所做的就是调用grab_set()和focus()两个方法,这对我解决了问题。你已经有了finalRoot.grab_set(),只需添加以下代码:
finalRoot.focus()

在我的情况下它起作用了。


1
这对我来说有效,使用.focus_force()而不是.focus() - bart cubrich

3

我尝试了上述解决方案,并发现在Windows Vista/Python 3.3上仅使用focus_force()就可以解决问题。此外,在创建您的Toplevel窗口时包括takefocus=True方法可能会有所帮助。


1

上述建议在我的 Mac OS El Capitan 上均不起作用,但是以下方法可以:

class Window(Tk.Toplevel):
    ...
    def setActive(self):
        self.lift()
        self.focus_force()
        self.grab_set()
        self.grab_release()
    ...

1
我遇到了同样的问题,尝试了我能找到的所有方法。不幸的是,答案取决于您的操作系统。在我的旧Mac上,窗口会自动聚焦,但在OSX Lion上不会。您列出的一些命令也与操作系统有关。

我的操作系统是Windows 7(专业版)。我想应该有办法,但看来不行... - Rushy Panchal

0
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
root.focus_force()

我也测试了这个,但它没有起作用(OSX 10.9.2)。目前最好的方法是 - 但并不适用于所有人 - self.root.wm_attributes("-topmost", 1) - JulienD
@muraveill 可能与平台有关,我的操作系统是Ubuntu 12.04。 - thinker3

0

虽然我来晚了,但如果有人想知道针对 python 3.9 的解决方案,只需要使用 focus() 就可以了。

所以,

top_window_name.focus()

就是这样。


0

这是对我有效的代码

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接