Вот подход, который немного отличается от определения GUI, использующего метапрограммирование на основе классов, а не наследование.
Это большая часть Django / SQLAlchemy, вдохновленная тем, что она в значительной степени основана на метапрограммировании и отделяет ваш код GUI от вашего «кода кода». Я также думаю, что он должен интенсивно использовать менеджеры компоновки, как это делает Java, потому что когда вы отбрасываете код, никто не хочет постоянно настраивать выравнивание пикселей. Я также думаю, что было бы здорово, если бы у нас были CSS-подобные свойства.
Вот пример грубого мозгового штурма, который покажет столбец с меткой вверху, затем текстовое поле, а затем кнопку для щелчка внизу, которая показывает сообщение.
from happygui.controls import *
MAIN_WINDOW = Window(width="500px", height="350px",
my_layout=ColumnLayout(padding="10px",
my_label=Label(text="What's your name kiddo?", bold=True, align="center"),
my_edit=EditBox(placeholder=""),
my_btn=Button(text="CLICK ME!", on_click=Handler('module.file.btn_clicked')),
),
)
MAIN_WINDOW.show()
def btn_clicked(sender): # could easily be in a handlers.py file
name = MAIN_WINDOW.my_layout.my_edit.text
# same thing: name = sender.parent.my_edit.text
# best practice, immune to structure change: MAIN_WINDOW.find('my_edit').text
MessageBox("Your name is '%s'" % ()).show(modal=True)
Замечательно, что вы можете сослаться на ввод my_edit, сказав MAIN_WINDOW.my_layout.my_edit.text
. Я думаю, что в объявлении для окна важно иметь возможность произвольно называть элементы управления в функции kwargs.
Это то же приложение, использующее только абсолютное позиционирование (элементы управления будут отображаться в разных местах, поскольку мы не используем модный менеджер компоновки):
from happygui.controls import *
MAIN_WINDOW = Window(width="500px", height="350px",
my_label=Label(text="What's your name kiddo?", bold=True, align="center", x="10px", y="10px", width="300px", height="100px"),
my_edit=EditBox(placeholder="", x="10px", y="110px", width="300px", height="100px"),
my_btn=Button(text="CLICK ME!", on_click=Handler('module.file.btn_clicked'), x="10px", y="210px", width="300px", height="100px"),
)
MAIN_WINDOW.show()
def btn_clicked(sender): # could easily be in a handlers.py file
name = MAIN_WINDOW.my_edit.text
# same thing: name = sender.parent.my_edit.text
# best practice, immune to structure change: MAIN_WINDOW.find('my_edit').text
MessageBox("Your name is '%s'" % ()).show(modal=True)
Я пока не совсем уверен, действительно ли это отличный подход, но я определенно думаю, что он на правильном пути. У меня нет времени больше исследовать эту идею, но если бы кто-то занялся этим как проектом, я бы полюбил их.