Konsole und GUI mischen

Zurück zur Übersicht


Wie bin ich eigentlich bisher immer vorgegangen? Es war doch immer der gleiche Ablauf. Python zeichnet sich neben seiner Funktionalität und seiner guten Lesbarkeit auch dadurch aus, dass man eben einfach mal ganz schnell etwas automatisieren kann, was man sonst mit der Hand immer und immer wieder mühselig eintippen muß.

Dadurch kam es meist so, dass ich schnell ein Konsolenprogramm "zusammengezimmert" habe, was zumindest erst mal die Arbeit machte. Damit war die angestrebte Erleichterung eigentlich schon da. Also alles gut und fertig?
Na nicht ganz. Beim häufigen Benutzen des Programms kamen meist verschiedene kleine Verbesserungen hinzu. Auch Fehler wuren sichtbar, die schnell behoben wurden. Kurzum, das Konsolenprogramm wurde immer besser, erledigte seine Aufgabe immer zuverlässiger. Im Idealfall wird es unentbehrlich, wenn nicht das spartanische Aussehen wäre. Für mich selbst wäre das ja noch gleichgültig, aber falls man mal einen Kollegen an den Früchten der eigenen Arbeit teilhaben lassen möchte und der nun grade nicht auf Textmodus steht, sollte man die Oberfläche etwas veredeln. Eine GUI muss her. Also das Konsolenprogramm auf eine Funktionssammlung zurechtgestutz und mit Tkinter eine Oberfläche drübergelegt. So war es immer. Aber warum eigentlich immer "entweder/oder"?

Für den hier beschriebenen Fall mag das alles vernünftig sein. Aber oft war es garnicht mein Ziel, eine perfekte Oberfläche zu schaffen, sondern ich nutzte Tkinter, weil die Widgets Funktionen zuließen, die ich sonst nicht gehabt hätte. Da ist zum Beispiel etwas, worüber ich mich schon ewig ärgere, dass man in raw_input keinen vorgewählten Text einstellen kann. Ich meine damit Text, der dem mit der Hand eingegebenen Text gleichgestellt ist und vor dem Ende der Eingabe mit <Enter> noch editiert werden kann. Aber deshalb gleich in die C-Programmierung einzusteigen, scheint mir auch zu aufwendig. Dabei kann das Entry-Widget aus Tkinter genau dies. Warum es nicht dafür nutzen, aber trotzdem auf Konsolenebene verbleiben?

Auf diese Idee kam ich erst, als ich mal ein Codebeispiel in "Python-gepackt" gesehen habe, wo der Autor eigentlich nur die Möglichjkeit der Umlenkung der Standardausgabe demonstrieren wollte. Er lenkte sie einfach auf ein Tkinter-Textfenster um. Alle print - Befehle landeten nun in diesem Fenster, während das Hauptprogramm weiter in der Konsole lief. Warum sollte etwas ähnliches nicht auch mit der Eingabe gehen?

Das könnte dann etwas so aussehen:

konsole




Die Vorgehensweise dafür ist garnicht so aufwändig, wie man zuerst befürchtet. Man legt eine Klasse an, die ein Tkinter-Fenster mit eingebettetem Entry-Widget bereitstellt. Aus dem Hauptprogramm wird dieses Fenster aufgerufen. Damit läuft aber das Programm nun im mainloop() des Tkinter-Fensters. Daher muss nach der Eingabe ein Ereignis definiert werden, dass das Fenster zerstört. Da die Instanz des Fensters aber weiterlebt", steht die eingegebene Zeichenkette als Rückgabewert noch zur Verfügung und kann weiter verarbeitet werden.
Das Ganze funktioniert offenbar und ist so angelegt, dass für den Konsolennutzer nun die neue, zusätzliche Funktion my_input() zur Verfügung steht. Ihr kann ein Parameter mitgegeben werden, der hier nicht den Prompt bildet, sondern den voreingestellten Text.

Der Quelltext des kleinen Beispiels sieht so aus: (und kann hier heruntergeladen werden)


quelltext