【问题标题】:Make a Tkinter Toplevel active激活 Tkinter 顶层
【发布时间】:2013-04-18 12:51:51
【问题描述】:

我正在尝试制作一个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 看到这些方法)和finalRoot.focus()

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

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

    finalRoot.focus()
    

    它在我的情况下有效。

    【讨论】:

    • 这对我有用 .focus_force() 而不是 .focus()
    【解决方案2】:

    我尝试了上述解决方案,发现 focus_force() 单独在 Windows Vista/Python 3.3 上工作。此外,在创建顶层窗口时包含 takefocus=True 方法可能会有所帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我的操作系统是 Windows 7(专业版)。我想会有办法,但猜不...
      【解决方案4】:

      以上建议在 Mac OS El Capitan 上均不适合我,但这确实有效:

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

      【讨论】:

        【解决方案5】:
        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)
        • @muraveill 可能取决于平台,我的操作系统是 Ubuntu 12.04。
        【解决方案6】:

        这是对我有用的代码

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

        【讨论】:

          【解决方案7】:

          我来晚了,但是如果有人想知道python 3.9 的解决方案,只需focus() 就可以了。

          所以,

          top_window_name.focus()

          就是这样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-06
            • 2018-05-26
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 2014-09-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多