Python 结构tkinter计划-最佳实践

Python 结构tkinter计划-最佳实践,python,oop,user-interface,tkinter,procedural-programming,Python,Oop,User Interface,Tkinter,Procedural Programming,我现在深入研究tkinter,互联网上的许多代码示例只涉及非常简单的示例,没有教授最佳实践 为了更好的可维护性和清晰性,我希望将OOP用于GUI,这在我看来是有意义的。 然而,我会接受你关于如何构建它的建议,因为我一般是初学者。 我已经浏览了其他问题,但它们无法回答我的具体问题 我的想法: 要为GUI创建一个菜单栏,并创建一个仅处理该菜单的新文件menu.py。在这里,您可以找到两个示例: 1。示例: 从逻辑上讲,菜单栏由其他菜单组成。所以菜单包含菜单。但是我不确定使用嵌套类是否好 import

我现在深入研究tkinter,互联网上的许多代码示例只涉及非常简单的示例,没有教授最佳实践

为了更好的可维护性和清晰性,我希望将OOP用于GUI,这在我看来是有意义的。 然而,我会接受你关于如何构建它的建议,因为我一般是初学者。 我已经浏览了其他问题,但它们无法回答我的具体问题

我的想法:

要为GUI创建一个菜单栏,并创建一个仅处理该菜单的新文件menu.py。在这里,您可以找到两个示例:

1。示例: 从逻辑上讲,菜单栏由其他菜单组成。所以菜单包含菜单。但是我不确定使用嵌套类是否好

import tkinter as tk

class Menu(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.menubar = Menubar(self)

    class Menubar(tk.Menu):
        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent, *args, **kwargs)
            self.parent = parent

            self.add_cascade(label="File", menu=self.file_menu)
            self.add_cascade(label="Edit", menu=self.edit_menu)

            self.file_menu = FileMenu(self)
            self.edit_menu = EditMenu(self)

        class FileMenu(tk.Menu):
            def __init__(self, parent, *args, **kwargs):
                super().__init__(parent, *args, **kwargs)
                self.parent = parent

        class EditMenu(tk.Menu):
            def __init__(self, parent, *args, **kwargs):
                super().__init__(parent, *args, **kwargs)
                self.parent = parent
2。示例:在这里,您可以找到一个更具程序性的示例。但在我看来,这里的缺点是菜单栏、文件菜单和编辑菜单处于同一级别。但从逻辑上讲,菜单栏由文件菜单和编辑菜单组成。所以,它不是真正的模块化。另一方面,它可能比第一个例子更容易阅读

import tkinter as tk

class Menu(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.menubar = tk.Menu(self)

        self.create_file_menu(self.menubar)
        self.create_edit_menu(self.menubar)

    def create_file_menu(self, parent):
        self.file_menu = tk.Menu(parent)
        self.menubar.add_cascade(label="File", menu=self.file_menu)

    def create_edit_menu(self, parent):
        self.edit_menu = tk.Menu(parent)
        self.menubar.add_cascade(label="Edit", menu=self.edit_menu)

嵌套类不会降低或提高执行效率。它可能会改变维护和理解效率。Python的嵌套类不像Java的嵌套类,内部类可以引用外部类的实例。它们实际上是两个独立的类

因此,您的示例1优于示例2

另见


你知道你在另一个类中声明了一个类吗?是的,我在我的文本中写了这个。很抱歉,我没有看到这一部分,但最好将它们分开,在需要时调用它们。我认为这会更适合这个问题。这可能是一个太宽泛的问题。然而,我同意@whatstthepoint。在这种情况下,我认为嵌套类是没有用的,如果您想重用某些东西,以后可能会遇到一些恼人的问题。