ООП в Python. Как организовать класс с родительским окном и класс с дочерним окном? Собственно есть такой код накиданый мной. Изначально передо мной была задача: Создать приложение с использованием tkinter и ООП подхода к построению GUI, чтоб было главное окно и дочернее, которое вызывается по клику на кнопку. Я новичёк, но погуглив и почитав литературу моё решение вылилось в такой вот код. Есть основной класс Main который наследуется от Frame и является родительским окном, также есть класс Child который наследуется от Toplevel в свою очередь является дочернем окном.
Вопрос состоит в том, на сколько корректно я реализовал данную задачу с профессиональной точки зрения. Хочу мнения опытных Питонистов, данная задача всплывает у многих в той или иной реализации. Есть желания создать базовый шаблон чтоб дальше продолжить реализацию собственного приложения.import tkinter as tk


class Main(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.init_main()

def init_main(self):
toolbar = tk.Frame(bg='#d7d8e0', bd=2)
toolbar.pack(side=tk.TOP, fill=tk.X)

btnOpenDialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0, compound=tk.TOP)
btnOpenDialog.pack(side=tk.LEFT)

def open_dialog(self):
Child()


class Child(tk.Toplevel):
def __init__(self):
super().__init__(root)
self.title('Добавить доходы/расходы')
self.geometry('400x220+400+300')
self.resizable(False, False)

if __name__ == "__main__":
root = tk.Tk()
app = Main(root)
app.pack()
root.title("Домашние финансы")
root.geometry("650x450+300+200")
root.resizable(False, False)
root.mainloop()

21 Авг 2019 в 07:02
190 +1
0
Ответы
1

Ваше решение вполне корректно с точки зрения ООП и использования библиотеки Tkinter для создания GUI приложений на Python. В вашем коде основное окно (Main) является родительским, а дочернее окно (Child) вызывается при нажатии на кнопку.

Однако, чтобы улучшить структуру и сделать ее более модульной, можно внести некоторые улучшения.

Передача root в класс Child:
В вашем коде при создании объекта Child вы передаете root напрямую, что может привести к проблемам связанным с глобальной переменной root. Лучше передавать root в качестве аргумента:

def open_dialog(self):
Child(self.master)

Добавление self.master в класс Child:
Также, вам нужно изменить метод __init__ в классе Child и обратиться к родительскому окну через self.master:

def __init__(self, master):
super().__init__(master)
self.title('Добавить доходы/расходы')
self.geometry('400x220+400+300')
self.resizable(False, False)

Эти улучшения помогут сделать ваш код более гибким и упростят его дальнейшее развитие. В остальном, ваше решение хорошее и соответствует задаче создания оконного приложения с использованием ООП и Tkinter.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир