首页 > 解决方案 > 使用类来构建由其他对象组成的对象是一种好习惯吗?

问题描述

我正在使用 Python/Tkinter 构建一个应用程序,并遇到了这个“问题”:

让我们使用这段代码:

from tkinter import *

class Foo():

    def __init__(self, window):

        self.this_frame = Frame(window)

        self.generic_txt_label = Label(self.this_frame, text="Value:")
        self.generic_txt_label.grid(row=0, column=0, sticky=W)
        
        self.value_label = Label(self.this_frame, text="0.00")
        self.value_label.grid(row=0, column=1, sticky=W)

        self.this_frame.grid()

root_window = Tk()

bar = Foo(root_window)

root_window.mainloop()

该代码将生成一个内部带有两个标签的框架。在我的应用程序中,我需要 3 个该框架,我认为我可以做到bar_2 = Foo(root_window)并且bar_3 = Foo(root_window).

这是一个好习惯吗?使用一个类来创建和组合多个对象。如果没有,我该怎么做?

标签: pythonclasstkinter

解决方案


是的,绝对是,而且很常见。而且您距离另一个非常常见的做法只有一小步,即对现有的 tkinter 小部件进行子类化以制作您自己的自定义小部件。尝试这个:

from tkinter import *

class Foo(Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, **kwargs)

        self.generic_txt_label = Label(self, text="Value:")
        self.generic_txt_label.grid(row=0, column=0, sticky=W)

        self.value_label = Label(self, text="0.00")
        self.value_label.grid(row=0, column=1, sticky=W)

root_window = Tk()
bar = Foo(root_window)
bar.grid()

bar_2 = Foo(root_window)
bar_2.grid()

bar_3 = Foo(root_window)
bar_3.grid()

root_window.mainloop()

现在 Foo 具有 tkinter Frame 的所有属性,如 pack() 和 grid(),并且表现得就像 Frame,因为它实际上是 Frame 的一种。


推荐阅读