让Tkinter Toplevel激活

时间:2013-04-18 12:51:51

标签: python tkinter

我正在尝试创建一个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()(我在another question看到了这些方法)和{{1} }。

程序启动时,第一个窗口finalRoot.focus()处于活动状态。但是,Tk()不是。我还尝试制作了两个Toplevel()(销毁Tk(),然后创建root作为新的finalRoot实例),但这也不起作用。我怎样才能做到这一点?谢谢!

7 个答案:

答案 0 :(得分:4)

  

...但是,我必须先在窗口中单击以使其变为活动状态,然后才能正常工作。

我刚遇到这个问题,在研究解决方案时,我发现了这个问题。我使用的是Windows 7专业版。我所做的只是致电 {/ strong> grab_set()focus(),它解决了我的问题。您已经拥有finalRoot.grab_set(),只需添加:

finalRoot.focus()

它适用于我的情况。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我尝试了上述解决方案,发现focus_force()单独适用于Windows Vista / Python 3.3。在创建Toplevel窗口时也可以包含takefocus=True方法。

答案 3 :(得分:1)

上述建议均未在Mac OS El Capitan上发挥作用,但确实如此:

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

答案 4 :(得分:0)

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

答案 5 :(得分: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()

答案 6 :(得分:0)

我来得太晚了,但如果有人想知道 python 3.9 的解决方案,只需一个 focus() 即可。

所以,

top_window_name.focus()

就是这样。