ООП в 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
168 +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
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 96 424 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир