I have been playing with the Ruby library ‘shoes’. Basically you can write a GUI application in the following way:
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
This made me think – how would I design a similarly nice-to-use GUI framework in Python? One that doesn’t have the usual tyings of basically being wrappers to a C* library (In the case of GTK, Tk, wx, QT etc etc)
Shoes takes things from web devlopment (like #f0c2f0 style colour notation, CSS layout techniques, like :margin => 10), and from ruby (extensively using blocks in sensible ways)
Python’s lack of ‘rubyish blocks’ makes a (metaphorically)-direct port impossible:
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 where near as clean, and wouldn’t be nearly as flexible, and I’m not even sure if it would be implementable.
Using decorators seems like an interesting way to map blocks of code to a specific action:
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
Basically the decorator function stores the function, then when the action occurred (say, a click) the appropriate function would be executed.
The scope of various stuff (say, the la label in the above example) could be rather complicated, but it seems doable in a fairly neat manner..
You could actually pull this off, but it would require using metaclasses, which are deep magic (there be dragons). If you want an intro to metaclasses, there’s a series of articles from IBM which manage to introduce the ideas without melting your brain.
The source code from an ORM like SQLObject might help, too, since it uses this same kind of declarative syntax.