workaround for generating gui tools
Bengt Richter
bokr at oz.net
Sun Apr 10 22:08:31 EDT 2005
On Sat, 9 Apr 2005 19:22:16 +0200, "Fredrik Lundh" <fredrik at pythonware.com> wrote:
>Reinhold Birkenfeld wrote:
>
>> It's evil anyway (for more complex applications) to put GUI construction
>> in your code. GUI should be described appropriately in data files.
>
>why use data files when you have an extremely powerful programming
>language in your toolbox? the advantage of building UI's in Python is
>that you can quickly create "domain specific UI languages", and use them
>to generate the interfaces for you. UI editors may be useful for trivial
>applications, but if you're doing complex stuff, you sure want domain-
>specific abstractions. Python gives you that, XML files don't.
>
Suppose tkinter elements all had a standard python property called, say, textview,
and for any given element in a GUI hierarchy, you could get and set and delete
this textview property, with suitable side effects. If you wrote python like
print mywidget.textview
You might see something like Delphi's representation of a nested "panel" widget
with a label, text entry slot, and button (excerpted from a full form representation):
"""
object Panel1: TPanel
Left = 400
Top = 160
Width = 185
Height = 113
TabOrder = 0
object Label2: TLabel
Left = 24
Top = 16
Width = 65
Height = 13
Caption = 'Example label'
end
object Edit1: TEdit
Left = 24
Top = 32
Width = 121
Height = 21
TabOrder = 0
Text = ' (example text entry)'
end
object Button1: TButton
Left = 24
Top = 64
Width = 121
Height = 25
Caption = 'Example Submit'
TabOrder = 1
end
end
"""
(The parent form or GUI element specifies other things that are inherited (e.g. fonts etc),
so those aren't part of the widget representation unless you have locally
edited those attributes one way or another, in which case they would show up)
(I might add a standard TEXTVIEW_VERSION = ... line as the first line of output
in case you wanted to save a design for later (perhaps much later) but Delphi
doesn't seem to).
Anyway, with a textview property you could write
open('mywidget_v2.txt','w').write(repr(mywidget.textview)
and if the textview property round-tripped, you could edit mywidget_v2.txt
with emacs or vim or a program, and then (just as an example) write
mywidget.textview = open('mywidget_v2.txt').read()
and see the changes. Creating or deleting mywidget would be modifying the textview
of the parent, if you were doing it via textview, except that del mywidget.textview
might effectively delete mywidget from the parent. Not sure what would be most useful.
The textview is an alternate and fairly programming-language-agnostic representation
of a GUI design element. Obviously it would not be much of a transformation to convert
to nested python dict representation for the above (and for a python interface to tkinter
that might be better than text). It would not surprise me to find that someone has
done a tkinter walker (maybe it's built into tkinter, I haven't dug) that does something
like this for the read view, but I wonder about the round trip replacement write.
Anyway, I think this kind of programming-language-agnostic representation may be what
Reinhold is getting at, and the "evil" being non-programming-language-agnosticism
in GUI design representation (though textview representation syntax would be a language syntax too ;-)
Using Delphi's conventions might permit interesting interchange with the Delphi world, and I know
there is some Delphi/Python synergy being pursued, though I haven't looked into it, so I'd bet
there is python code somewhere translating between Delphi and tkinter. I just thought of this
textview property to help make my take on Reinhold's post clear, but I could see it making
GUI design interchange in general easier to have a standard representation for that purpose.
XML is too crufty for my taste, but the idea of a very broadly applicable definition of
useful pure abstractions with standard concrete representations appeals to me (I know of ASN ;-)
IMO XML has gotten a place in the world because it works well enough that people
who want to get other work done can't wait for it to be replaced with something better,
not because it's the best thing. Sort of like how MSDOS got its place in the world.
Alternatively, GUI elements could have registrable encode/decode methods with
some kind of UniGUIcode abstract core ;-) I kind of like that, off hand...
Regards,
Bengt Richter
More information about the Python-list
mailing list