在 tk.TopLevel 上使用 super() 但不生成第二个 window?
Using super() on tk.TopLevel, but do not generate second window?
我正在尝试实现一个简单的 MVC 应用程序。
当调用 super().__init__()
时,在我的 python 应用程序中生成了两个 windows。
当我只想生成一个 window 时,尝试从 tk.TopLevel 继承时,正确的用法是什么?
import tkinter as tk
from tkinter import ttk
class View(tk.Toplevel):
def __init__(self, controller):
super().__init__()
self.controller = controller
def exec_main(self):
self.mainloop()
class Controller:
def __init__(self):
self.view = View(self)
if __name__ == '__main__':
app = Controller()
app.view.exec_main()
做 super().__init__(master=self)
或 super().__init__(self)
之类的事情似乎不是解决方案。
另一种方法是对主程序执行类似的操作:
import tkinter as tk
class View(tk.Toplevel):
def __init__(self, master):
tk.Toplevel.__init__(self, master)
class Controller:
def __init__(self, root):
self.view = View(root)
if __name__ == '__main__':
root = tk.Tk()
root.withdraw()
app = Controller(root)
root.mainloop()
但这似乎很浪费。
无一例外,除根 window 之外的每个小部件都需要父级。如果您不创建根 window,那么将为您创建一个。当您创建 Toplevel
的实例并调用 super().__init__()
时,如果您没有根 window,那么 tkinter 将为您创建一个。
如您所见,正确的解决方法是显式创建根 window 然后隐藏它。您必须确保为用户提供销毁此根 window 的方法,因为当您关闭 Toplevel
windows.
时它不会自动销毁
我正在尝试实现一个简单的 MVC 应用程序。
当调用 super().__init__()
时,在我的 python 应用程序中生成了两个 windows。
当我只想生成一个 window 时,尝试从 tk.TopLevel 继承时,正确的用法是什么?
import tkinter as tk
from tkinter import ttk
class View(tk.Toplevel):
def __init__(self, controller):
super().__init__()
self.controller = controller
def exec_main(self):
self.mainloop()
class Controller:
def __init__(self):
self.view = View(self)
if __name__ == '__main__':
app = Controller()
app.view.exec_main()
做 super().__init__(master=self)
或 super().__init__(self)
之类的事情似乎不是解决方案。
另一种方法是对主程序执行类似的操作:
import tkinter as tk
class View(tk.Toplevel):
def __init__(self, master):
tk.Toplevel.__init__(self, master)
class Controller:
def __init__(self, root):
self.view = View(root)
if __name__ == '__main__':
root = tk.Tk()
root.withdraw()
app = Controller(root)
root.mainloop()
但这似乎很浪费。
无一例外,除根 window 之外的每个小部件都需要父级。如果您不创建根 window,那么将为您创建一个。当您创建 Toplevel
的实例并调用 super().__init__()
时,如果您没有根 window,那么 tkinter 将为您创建一个。
如您所见,正确的解决方法是显式创建根 window 然后隐藏它。您必须确保为用户提供销毁此根 window 的方法,因为当您关闭 Toplevel
windows.