简体   繁体   English

在 tk.TopLevel 上使用 super(),但不生成第二个 window?

[英]Using super() on tk.TopLevel, but do not generate second window?

I am attempting to implement a trivial MVC application.我正在尝试实现一个简单的 MVC 应用程序。 When super().__init__() is called, two windows are generated in my python application.当调用super().__init__()时,在我的 python 应用程序中生成了两个 windows。

What is the appropriate usage when attempting to inherit from tk.TopLevel, when I only want to generate one window?当我只想生成一个 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()

Doing something like super().__init__(master=self) or super().__init__(self) does not seem to be the solution.做类似super().__init__(master=self)super().__init__(self)似乎不是解决方案。

An alternative approach would be to do something like this for the main:另一种方法是对主要做这样的事情:

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

But this seems wasteful.但这似乎很浪费。

Without exception, every widget except the root window requires a parent.无一例外,除了根 window 之外的每个小部件都需要一个父小部件。 If you don't create a root window then one will be created for you.如果您不创建根 window,那么将为您创建一个。 When you create an instance of Toplevel and call super().__init__() , if you don't have a root window then tkinter will create one for you.当您创建Toplevel实例并调用super().__init__()时,如果您没有根 window ,那么 tkinter 将为您创建一个。

As you've observed, the correct workaround is to explicitly create a root window and then hide it.正如您所观察到的,正确的解决方法是显式创建根 window 然后隐藏它。 You have to make sure to give the user a way to destroy this root window since it won't automatically be destroyed when you close the Toplevel windows.您必须确保为用户提供一种销毁此根 window 的方法,因为当您关闭顶层Toplevel时它不会自动销毁。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM