Я играл с рубиновой библиотекой "обувь". По сути, вы можете написать приложение с графическим интерфейсом следующим образом:
Shoes.app do
t = para "Not clicked!"
button "The Label" do
alert "You clicked the button!" # when clicked, make an alert
t.replace "Clicked!" # ..and replace the label's text
end
end
Это заставило меня задуматься - как бы я спроектировал подобный удобный графический интерфейс в Python? Тот, у которого нет обычной связи с тем, что он в основном является обёрткой для библиотеки C * (в случае GTK, Tk, wx, QT и т. Д.)
Обувь берет вещи из веб-разработки (например, цветовая нотация в стиле * 1006, методы CSS-разметки, например :margin => 10
) и из рубина (интенсивное использование блоков разумным образом)
Отсутствие в Python «рубиновых блоков» делает (метафорически) прямой порт невозможным:
def Shoeless(Shoes.app):
self.t = para("Not clicked!")
def on_click_func(self):
alert("You clicked the button!")
self.t.replace("clicked!")
b = button("The label", click=self.on_click_func)
Нет, где почти так же чисто, и не будет почти столь же гибким, и я даже не уверен, будет ли это осуществимо.
Использование декораторов кажется интересным способом сопоставления блоков кода определенному действию:
class BaseControl:
def __init__(self):
self.func = None
def clicked(self, func):
self.func = func
def __call__(self):
if self.func is not None:
self.func()
class Button(BaseControl):
pass
class Label(BaseControl):
pass
# The actual applications code (that the end-user would write)
class MyApp:
ok = Button()
la = Label()
@ok.clicked
def clickeryHappened():
print "OK Clicked!"
if __name__ == '__main__':
a = MyApp()
a.ok() # trigger the clicked action
По сути, функция декоратора сохраняет функцию, затем, когда действие произошло (скажем, щелчок), соответствующая функция будет выполнена.
Область действия различных вещей (скажем, метка la
в приведенном выше примере) может быть довольно сложной, но кажется, что она выполнима довольно аккуратно ...