simples TUI-Toolkit

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Armageddon
User
Beiträge: 7
Registriert: Dienstag 16. März 2010, 15:09
Wohnort: Ruhla

Hallo erstmal! (Mein erster Beitrag)

Ich habe mir main mein eingenes TUI-Toolkit gebastelt.

http://pastebin.de/4671

Was es kann:
-Eingabefelder: die Länge kann begrenzt und ein Standarttext definiert werden.
- unterarten von Eingabefeldern: Zahlenfelder, Passwortfelder
- Checkboxen
- Radioboxen
- Labels (auch mehrzeilig)
- Meldungen auch mehrzeilig und in 3 Typen: Nachfragen, Wartemeldungen und einfach Masanges. Hier können Farbpaare übergeben werden.
- Buttons

Was es nicht kann:
-Ohne Probleme mit dem Fokus Widgets entfernen/hinzufuegen
-Ohne fokus auskommen (d.h. wenn nur Labels vorhanden sind gibt es eine Endlosschleife)
-Widgets sichtbar deaktivieren. So geht es nur durch schreiben des Atributes takefocus
-Widgets automatisch ausrichten

Ein Beispielprogramm liegt bei![/list][/list]
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Statt:

Code: Alles auswählen

if not chr(x) in ["1","2","3","4","5","6","7","8","9","0"]:
...kannst du auch direkt über `"1234567890"` iterieren. Oder halt `"".join(str(n) for n in xrange(10))`. ;)

Was noch auffällt ist, dass Leerzeichen an manchen Stellen die Lesbarkeit ungemein erhöhen würden. Mit der Programm-Logik an sich hab ich mich jetzt nicht näher beschäftigt.
BlackJack

@snafu: ``if not chr(x).isdigit():`` ginge auch noch.

@Armageddon: Du nutzt Tab zum Einrücken bzw. manchmal auch Leerzeichen. Der Quelltext ist so zum Beispiel bei mir im Editor "unlesbar" weil ein Tab bei mir standardmässig als vier Leerzeichen dargestellt wird, Du allerdings anscheinend von acht ausgehst. Alle Methoden-``def``\s werden bei mir deshalb auf der gleichen Ebene angezeigt wie deren Körper.

Das `screen`-Attribut kommt bei den Klassen einfach aus dem "nichts". Das sollte man wenigstens in der `__init__()` an `None` binden.

Anstelle der vielen "magischen" Zahlen sollte man besser Konstanten verwenden. Also zu Beispiel `curses.ascii.DEL` statt 127.

Sprachen mischen ist nicht so toll. `takefocus` und `fokus` in ein und der selben Klasse ist verwirrend und verleitet dazu eines von beiden irgendwann mal falsch zu schreiben.

`IntEntry` teilt sich einen Grossteil der `push()`-Methode vom `TextEntry`. An der Stelle würde ich über eine `validate()`-Methode nachdenken, die den neuen Inhalt des Widgets gegen irgendeine Bedingung prüft. Beim `TextEntry` kann die immer `True` liefern und bei Unterklassen kann man sie dann überschreiben und zum Beispiel testen ob die Zeichenkette ein gültiges `int` wäre. Vielleicht sogar optional mit Ober und/oder Untergrenze.

Ebenfalls viel gemeinsam haben `RadioBox` und `CheckBox`.

Bei `Label.render()` fallen mir die kurzen Namen sehr unangenehm auf. Ist es wirklich so schlimm `lines` statt `l` zu schreiben? Das `l` kann man zudem bei einigen Schriftarten sehr leicht mit einer 1 verwechseln. Aber letztendlich hätte ich das gar nicht an einen Namen gebunden. Das manuelle hochzählen von `i` lässt sich mit `enumerate()` vermeiden.

`Dialog.Widgets` verstösst gegen die Namenskonvention in PEP8. Warum gerade hier diese Ausnahme?

Das `type_`-Argument bei `alert()` widerspricht OOP. Die Methode tut zuviele verschiedene Dinge. Ein ``else`` am Ende sollte prüfen, ob der Aufrufer einen unbekannten `type_` übergeben hat.

In der `mainloop()` ist zweimal der gleiche Quelltext um den Fokus weiterzusetzen. Und der hat Probleme. Einmal wenn es keine Widgets gibt, und dann wenn es keine gibt, die den Fokus entgegennehmen. Dann ist das nämlich eine Endlosschleife.

Wenn man Wahrheitswerte meint, sollte man keine Zahlen verwenden. ``while 1:`` schreibt man also besser als ``while True:``.

`x` und `y` für Koordinaten ist ja in Ordnung, aber in einem Programm das diese Namen für Koordinaten verwendet, sie auch noch für Tastaturcodes zu verwenden ist sehr verwirrend.
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:@snafu: ``if not chr(x).isdigit():`` ginge auch noch.
Wobei man da zugegeben auch auf den konkreten Anwendungsfall gucken muss:

Code: Alles auswählen

>>> str(12) in "123"
True
>>> str(12) in map(str, [1,2,3])
False
>>> "12".isdigit()
True
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Es gibt ja auch noch string.digits...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab mal die Einrückung korrigiert: http://pastebin.de/4684

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls es wirklich auf einstellige Zahlen ankommt, könnte man entsprechend `number in iter(string.digits)` nehmen.
Antworten