4

我正在尝试制作一个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()实例),但这也不起作用。我怎样才能做到这一点?谢谢!

4

7 回答 7

7

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

我刚遇到这个问题,在研究解决方案时,我发现了这个线程。我正在使用 Windows 7 专业版。我所做的只是打电话给两者 grab_set()focus()它为我解决了这个问题。您已经有了finalRoot.grab_set(),只需添加:

finalRoot.focus()

它在我的情况下有效。

于 2014-08-17T06:07:33.370 回答
2

我尝试了上述解决方案,发现focus_force()仅适用于 Windows Vista/Python 3.3。takefocus=True在创建顶层窗口时包含该方法也可能会有所帮助。

于 2014-10-11T23:59:08.157 回答
1

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

于 2013-04-19T17:28:03.870 回答
1

在 Mac OS El Capitan 上,上述建议都不适用于我,但这确实:

class Window(Tk.Toplevel):
    ...
    def setActive(self):
        self.lift()
        self.focus_force()
        self.grab_set()
        self.grab_release()
    ...
于 2017-07-13T18:38:59.997 回答
0
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
root.focus_force()
于 2013-08-29T15:49:16.510 回答
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()
于 2020-11-24T17:53:55.390 回答
0

我在这里为时已晚,但如果有人想知道 的解决方案,那就行python 3.9focus()

所以,

top_window_name.focus()

而已。

于 2021-06-03T06:27:08.783 回答