Builds dialogs from ASCII art definition.

## Project description

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.

## 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.

## Project details

Uploaded source
Uploaded py3