Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter:如何定义弹出窗口(并使其聚焦)?_Python_Tkinter - Fatal编程技术网

Python Tkinter:如何定义弹出窗口(并使其聚焦)?

Python Tkinter:如何定义弹出窗口(并使其聚焦)?,python,tkinter,Python,Tkinter,我在Ubuntu 20.04上,正在努力使iconify()和deiconify()用于弹出窗口。当前,图标化后弹出窗口将不会deiconify()。下面是一个简单的例子: import tkinter as tk class PopupWindow(tk.Toplevel): """ Show summary """ def __init__(self, root): super().__in

我在Ubuntu 20.04上,正在努力使
iconify()
deiconify()
用于弹出窗口。当前,图标化后弹出窗口将不会
deiconify()
。下面是一个简单的例子:

import tkinter as tk

class PopupWindow(tk.Toplevel):
    """ Show summary
    """
    def __init__(self, root):
        super().__init__(master=root)
        self.root = root
        self.geometry("600x400")
        self.title("Summary")
        self.protocol("WM_DELETE_WINDOW", self.close_window)
        button = tk.Button(
            self, text="Close", command=self.close_window)
        button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
        self.focus_force()
        self.grab_set()

    def close_window(self):
        self.iconify()
        #self.withdraw()
        #self.transient()
        #self.root.grab_set()
        #self.root.focus_force()

class MainWindow(tk.Tk):
    """ The main window
    """
    def __init__(self):
        tk.Tk.__init__(self)
        self.popup_window = None
        self.configure_window()

    def open_popup_window(self):
        """ Opens the popup window
        """
        if self.popup_window is None:
            self.popup_window = PopupWindow(self)
        else:
            self.popup_window.deiconify()
            #self.popup_window.lift()
            self.popup_window.focus_force()
            #self.popup_window.grab_set()

    def configure_window(self):
        """ Configure the main window
        """
        self.geometry("600x400")
        self.title("Cinema bookkeeper")
        self.bind_all('<Control-w>', lambda e: self.destroy())
        button = tk.Button(
            self, text="Open popup window", command=self.open_popup_window)
        button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)


def main():
    window = MainWindow()
    window.mainloop()

main()
将tkinter作为tk导入
类PopupWindow(tk.Toplevel):
“”“显示摘要
"""
定义初始化(自,根):
super()。\uuuu init\uuuu(master=root)
self.root=根
自几何(“600x400”)
自我介绍标题(“摘要”)
self.protocol(“WM\u删除\u窗口”,self.close\u窗口)
按钮=tk.按钮(
self,text=“Close”,command=self.Close\u窗口)
按钮位置(relx=0.5,rely=0.5,锚定=tk.CENTER)
self.focus_force()
self.grab_set()
def关闭_窗口(自):
self.iconify()
#self.draw()
#self.transient()
#self.root.grab_set()
#self.root.focus\u force()
类主窗口(tk.tk):
“”“打开主窗口
"""
定义初始化(自):
tk.tk.\uuuuu初始化(self)
self.popup_window=无
self.configure_window()
def打开弹出窗口(自):
“”“打开弹出窗口
"""
如果self.popup_窗口为无:
self.popup_window=PopupWindow(self)
其他:
self.popup_window.deiconify()
#self.popup_window.lift()
self.popup\u window.focus\u force()
#self.popup\u window.grab\u set()
def配置_窗口(自):
“”“配置主窗口。”
"""
自几何(“600x400”)
self.title(“电影院簿记员”)
self.bind_all(“”,lambda e:self.destroy())
按钮=tk.按钮(
self,text=“打开弹出窗口”,command=self.Open\u popup\u window)
按钮位置(relx=0.5,rely=0.5,锚定=tk.CENTER)
def main():
窗口=主窗口()
window.mainloop()
main()

当我在第一次图标化后第二次单击“打开弹出窗口”按钮时,什么也没有发生。预期的行为是弹出窗口将重新出现并获得焦点。如果我使用
grab\u set()
,我可以让它工作,但我不希望使弹出窗口成为模式,这样两个窗口仍然可以同时接收输入。

方法
grab\u set
将应用程序的所有事件路由到指定的小部件

由于您在弹出窗口上调用了
self.grab_set()
,主窗口将拒绝接收任何事件(开始时从未单击该按钮),因此程序无法运行


删除它会使它工作。

谢谢这似乎有帮助,另一件事是
self.iconify()
(或单击窗口的最小化按钮)在Ubuntu上无法按预期工作。在这种情况下,通过调用
deiconify()
无法使窗口重新出现。相反,如果我使用
self.draw()。