Last updated:
0 purchases
asciidesigner 0.6.0
A library that:
creates GUI from ASCII-art (with well-defined syntax)
maps widgets to virtual class attributes
relieves you from the boring parts of Form building while leaving you in
control.
Did you ever design a form by scribbling something like this in your editor:
Text to transform: [ Text_ ]
Select transformation:
(x) Uppercase
( ) Lowercase
( ) Title-case
[ OK ] [ Cancel ]
… and wished that you could be done with design and start coding? Wish no longer:
from ascii_designer import AutoFrame
class TextTransformer(AutoFrame):
f_body='''
| <-> |
Text to transform: [ Text_ ]
Select transformation:
(x) Uppercase
( ) Lowercase
( ) Title-case
[ OK ] [ Cancel ]~
'''
def ok(self):
text = self.text
if self.uppercase:
text = text.upper()
elif self.lowercase:
text = text.lower()
elif self.titlecase:
text = text.title()
print(text)
self.close()
def cancel(self):
self.close()
if __name__ == '__main__':
TextTransformer().f_show()
Some comments, incidentally highlighting the features of this library:
As you probably guessed, all the magic happens in AutoFrame. The
f_show call triggers rendering of the form. All the reserved attributes
are prepended with f_ to get out of your way when subclassing.
There is a well-defined syntax for how to get the usual widget types. In the
example you can find labels (plain text), a text box, radio buttons and normal
buttons.
The columns are defined by the header row with the pipe characters. The
minus sign denotes stretching columns. (The < / > chars are just
decoration.)
Column-span is easily done by having not-a-space underneath the pipe
symbol. Row-span can also be done by prepending subsequent cells with a
{ character.
Anchoring is controlled by whether the cell is space-padded or not. For
example, the Text box stretches, while the cancel button is centered. The
tilde character can be used instead of a fragile trailing space.
Widget IDs are automatically generated by lowercasing and whitelisting the
captions.
If a method exists with the same name as a widget id, it is automatically
bound to the usually-wanted event (click in case of button, value-changed in
case of basically anything else). Oh, and close and quit are already
there for your convenience.
Otherwise, you can retrieve and set the widget’s value by using its id like
a class attribute.
f_show() captures all the usual boilerplate and simply f***ing shows
the frame. It can be used for both the toplevel and additional frames.
Also note how the class name automatically turned into the window title.
Override by setting .f_title.
The created widgets are “raw”, native widgets. You can configure the toolkit
to use. Currently there is a Qt and a Tkinter implementation. The native
widget can accessed using form["widget_id"] (or
form.f_controls["widget_id"]).
The general philosophy is to not paint everything over with wrappers. Instead,
the library focuses on specific tasks - building the layout, event-/value
binding - and lets you do everything else with the API you know and (maybe) love.
INSTALLATION
pip install ascii_designer
Requirements: Python >= 3, attrs. To use the Qt toolkit you need qtpy.
DOCUMENTATION
Please proceed to http://ascii_designer.readthedocs.io/en/latest/index.html
LICENCSE
MIT License: https://github.com/loehnertj/ascii_designer/blob/master/LICENSE
TODO
Alpha-state software, mostly working.
Test coverage is lacking, politely spoken.
This is a hobby project. If you need something quick, open an issue or send a pull request.
For personal and professional use. You cannot resell or redistribute these repositories in their original state.
There are no reviews.