如何让窗口专注于Tkinter中的新Toplevel()窗口?

时间:2013-04-11 08:55:43

标签: python-2.7 tkinter

我目前正在编写一个win32gui python27应用程序(我正在运行win7)。我想知道是否可以从我的mainloop()创建一个新窗口并保持对它的关注,可能是通过停止mainloop和停用根窗口。在一种伪代码示例中:

root=Tk()
#put in some widgets, such as statusbars, tkfileDialog widgets etc...
O=Toplevel()
OptionMenu(O) #wait for user to make his choices; btw: OptionMenu is a class...
tkFileDialog.askdirectory(...) #THEN interpret this line

基本上,我想实现tkfiledialog和tksimpledialog中大多数小部件的功能:
从主窗口(不仅仅是控制台焦点,wm焦点)窃取焦点,并恢复主循环,直到所有内容为止,例如,OptionMenu已经解决。我希望我能够明确地说明我的目标,我几周前刚开始使用Tkinter编程,可能会混淆和误解其背后的一些概念...... 这就是全部,伙计们!

3 个答案:

答案 0 :(得分:10)

您正在寻找的概念称为“抓取”。 Tkinter支持使用多种方法进行抓取。例如,要在顶层设置本地抓取,您将执行my_window.grab_set()。本地抓取是此窗口从您应用中的所有其他窗口抓取焦点的位置,但仅适用于您的应用。

您还可以进行全局抓取,除了特定窗口外,它可以有效地冻结整个显示。这非常危险,因为如果您的代码中存在错误,您可以轻松地将自己锁定在自己的计算机之外。

抓取取消激活mainloop功能。必须运行此窗口才能处理事件。它只是将所有事件重定向到具有抓取功能的窗口。

有关更多信息,请在此处阅读grab_set和其他抓取命令:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.grab_set-method

答案 1 :(得分:1)

在Mac OS El Capitan上,以上建议均不适用于我。但基于这些提示,这样做:

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

答案 2 :(得分:0)

puppeteer.launch({ headless: true }).then(async (browser) => { console.log("Running tests.."); const page = await browser.newPage(); for(let url of urls){ await page.goto(url); await page.screenshot({ path: "test" + number + ".png", fullPage: true }); console.log(`All done, check the screenshot. ✨`); } await browser.close(); }); 可以满足我的需求,并且可以阻止正常的窗口操作。答案是使一个Tkinter窗口弹出到其他Tkinter窗口的上方。

在我的应用中,我有一个大窗口grab.set(),它调用了一个较小的窗口toplevel,该窗口最初显示在top2的顶部。

如果用户在toplevel窗口中单击,它将获得焦点并窒息小得多的toplevel窗口,直到将top2窗口从窗口中拖出为止。

解决方案是单击toplevel中的按钮以再次启动topleveltop2打开功能知道它已经在运行,因此只需将其提升到顶部并使其聚焦即可:

top2