One thing that keeps me procrastinating about writing programs I have is doing up a user interface for them. It just seems like so much hassle writing GUI code or HTML, and if I just write for the command line, no one else will use it. Of course, most of the reason I don’t mind writing for the command line is that interaction is so easy, and much of that is thanks to the wonders of “printf”. But why not have a printf for GUIs? So I (kinda) made one:
f, n = guif.guif("%t %(edit)250e \n %(button)b", "Enter some text", "", "Press me!");
In theory, you can specify widget sizes using something like “%10,12t” to get a text box with a width of 10 and a height of 12, but it doesn’t seem to actually work at the moment, and might be pixel based instead of character based, which I’m not sure is a win. I was figuring you could say “%-t” for left aligned, and “%+t” for right aligned; and I guess you could do “%^t” for top and “%_t” for bottom alignment. I’ve currently just got it doing a bunch of rows laid out separately — you’d have to specify explicit widths to get things lined up; but the logical thing to do would be to use “\t” to automatically align things. It also doesn’t handle literals inside the format string, so you can’t say “Enter some text: %e\n%b”.
At the moment the two objects that returns are the actual frame (f), and a dictionary of named elements (n) in case you want to reference them later (to pull out values, or to make buttons actually do something, etc). That probably should be merged into a single object though.
I guess what I’d like to be able to write is a complete program that creates and displays a simple gui with little more than:
#!/usr/bin/env python import guif, wx f = guif.guif("Enter some text: %(edit)250e \n %(done)b", "", "Done!", stopon = ("done", wx.EVT_BUTTON)) print "Hey, you entered %s!" % f.edit.GetValue() f.Close()
I figure that should be little enough effort over the command line equivalent to be pleasant:
#!/usr/bin/env python import sys print "Enter some text:", x = sys.stdin.readline() print "Hey, you entered %s!" % x.strip()