【问题标题】:Structure tkinter program - Best practices构建 tkinter 程序 - 最佳实践
【发布时间】:2017-07-09 11:06:22
【问题描述】:

我目前正在深入研究 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。示例: 您可以在此处找到更多程序示例。但从我的角度来看,这里的弱点是菜单栏的层次结构以及 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)

【问题讨论】:

  • 你知道你在另一个类中声明一个类吗?
  • 是的,我在文中写了这个。
  • 抱歉没看到那部分,不过最好还是分开,需要的时候调出来
  • 我认为这更适合code Review SE
  • 这对于 SO 来说可能是一个过于宽泛的问题。不过,我同意@WhatsThePoint。在这种情况下,我认为嵌套类没有用——如果你想重用某些东西,以后可能会遇到烦人的问题。

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


【解决方案1】:

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

因此您的示例 1 比示例 2 更好。

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2020-11-14
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多