#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 .