结构tkinter程序 - 最佳实践

时间:2017-02-20 08:49:57

标签: python oop user-interface tkinter procedural-programming

此刻我深入了解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。示例:您可以在此处找到更多程序示例。但是从我的观点来看,这里的弱点是Menubar的层次结构以及file_menu和edit_menu处于同一水平。但从逻辑上讲,菜单栏包含file_menu和edit_menu。所以,它并不是真正的模块化。另一方面,它可能(?)比第一个例子更容易阅读。

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)

1 个答案:

答案 0 :(得分:0)

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

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

另见