Рекомендуется ли использовать класс для создания объекта из других объектов?

#python #class #tkinter

#python #класс #tkinter

Вопрос:

Я использую 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) .

Это хорошая практика? Использование класса для создания и объединения нескольких объектов. Если нет, то как мне это сделать?

Комментарии:

1. Похоже, вы спрашиваете мнения, что не по теме для Stackoverflow. Но да, это хорошая практика 🙂

Ответ №1:

Да, безусловно, и это очень распространено. И вы находитесь всего в одном коротком шаге от другой очень распространенной практики, которая заключается в подклассе существующего виджета 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, такие как pack() и grid() , и ведет себя точно так же, как фрейм, потому что это буквально тип фрейма.

Комментарии:

1. Я думал именно об этом, ожидая, пока кто-нибудь ответит, спасибо <3 .