He estado jugando con los "zapatos" de la biblioteca Ruby. Básicamente se puede escribir una aplicación de interfaz gráfica de usuario de la siguiente manera:¿Cómo diseñarías un marco de interfaz de usuario muy "pitónico"?
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
Esto me hizo pensar - ¿Cómo voy a diseñar un marco de interfaz gráfica de usuario de manera similar agradable de usar en Python? Uno que no tiene los tics habituales de ser básicamente envoltorios de una biblioteca C * (en el caso de GTK, Tk, wx, QT, etc.)
Zapatos toma cosas del web devlopment (como #f0c2f0
notación de color de estilo, técnicas de diseño CSS, como :margin => 10
), y de rubí (ampliamente utilizando bloques de manera sensible)
falta de "bloques rubyish" de Python hace un (metafóricamente) puerto -direct imposible:
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)
no está cerca tan limpio, y no sería casi tan flexible, y estoy Ni siquiera estoy seguro de si sería implementable.
El uso de decoradores parece una forma interesante para asignar bloques de código a una acción específica:
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
Básicamente, la función decoradora almacena la función, entonces cuando se produjo la acción (por ejemplo, un clic) la función apropiada sería ejecutado.
El alcance de varias cosas (por ejemplo, la etiqueta la
en el ejemplo anterior) podría ser bastante complicado, pero parece factible de una manera bastante ordenada ..
Tanto Ruby como Python son adecuados para DSL. La diferencia está en 'L'; es sinónimo de 'idiomas' para Ruby y 'bibliotecas' para Python. Podrías forzar algo de magia de sintaxis de Python, por ejemplo, los modelos de Django, pero ¿deberías? – jfs