Python Tkinter:如何定义弹出窗口(并使其聚焦)?
我在Ubuntu 20.04上,正在努力使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
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()。