GuiDesigner: 'blöde' Anfängerfrage

Fragen zu Tkinter.
Antworten
betonmoewe
User
Beiträge: 4
Registriert: Donnerstag 29. Oktober 2015, 20:12

Hallo,

ich versuche mich grade im GuiDesigner um meine ersten Schritte in Richtung Python und GUI zu machen. Ich habe nun ein Problem: ich habe mir mittels des GuiDesigners ein ganz einfaches Widget mit Button un Label gebaut.

Wie kann ich denn nun dem Button ein Command zuordnen? Im Designer ist das Feld grau und ich kann nichts eingeben. Auch im erzeugten Code ist nichts zu sehen. Es wird wirklich nur der Button und das Label dargestellt.
Bedeutet dies, ich muss die notwendigen weiteren Funktionen händisch hinzubauen (blos wie?) oder mache ich was bei der Benutzung falsch ??? Mit pygubu hatte ich mein "Test" Programm sofort hinbekommen :(


Gruß

die pythonGUIAnfängerBetonmöwe
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ja freilich ist dieses Feld grau, denn wofür willst Du einen String eingeben. Man programmiert schließlich in Python und tkinter nicht aber im GuiDesigner.
Und in pygubu kannst Du auch keinen Source Code eingeben, sondern nur reinschreiben, wie die Funktion heißt. Und die mußt Du auch selber manuell programmieren.

Aber wozu soll es gut sein, eingeben zu können, wie die Funktion heißt? Normalerweise gibt man dann im Programm einen Callback auf mybutton.config(command=myfunction) an.

Aber nicht normalerweise kann man doch im GuiDesigner auch schon eine solche Funktion eingeben, wenn man das unbedingt tun will.

Hier wäre etwa das Script hello.py:

Code: Alles auswählen

Button('button_hello',**{'text': 'Hello', 'bg': 'green'}).place(**{'y': '49', 'x': '59'})
Label('label_text',**{'text': 'Please press the button'}).place(**{'y': '19', 'x': '16'})
Das kannst Du ja mal mit abspeichern und dann mit dem GuiDesigner laden. Und dann wählst Du nicht den Label oder den Button aus, sondern den Container '.'

Und für Container Widgets kann man auch Code eingeben, wenn man denn so will. Dazu wählst Du dann im Menü aus: Special->Expert Options->Code
Und dann kannst Du dort eingeben:

Code: Alles auswählen

widget('button_hello')['command'] = lambda: print("Hello World")
Und drückst dann OK. Wenn Du Dich vertippt hast, gargelt eventuell das Programm ab. Ist aber nicht schlimm. Kannst nach dem nächsten Start wieder in Code gehen und mit dem Button 'Load' den vertippten Code wieder laden und korrigieren. Wenn Du Dich nicht vertippt hast und OK drückst, hast Du einen funktionierenden Button.

Wenn Du das dann speicherst und dann neu lädst, tut der Button, wenn Du mit Load & Run lädst. Und er tut nicht, wenn Du mit Load & Edit lädst. Normalerweise will man ja GUI editieren und nicht unbedingt ein Programm dabei laufen haben, das mitunter gar die GUI verändert.

Also ich benütze auch mitunter diese Code Option. Schreibe aber dann nur einen Kommentar rein, damit ich diese Stelle im Source Code mit meinem Editor gut finden kann. Mit diesem habe ich Syntax Highlighting und auch eine bessere Schrift. Ein Text Widget von tkinter ist da nicht gerade das Optimale.

Und auch noch gut an dieser Code Option ist: wenn man da etwas reinschreibt und sei es nur ein Kommentar, hat man dann im Source Code einen markierten Code Block und weiss dann, wo man zusätzlichen Source Code reinschreiben muss, damit dieser dann auch läuft oder nicht läuft und auch immer erhalten bleibt, wenn man wieder speichert.

Ach so, habe ich noch vergessen zu erwähnen, wenn man so einen Code eingegeben hat, sieht man im GuiDesigner um den Container eine blaue Markierung. Das bedeutet, dass dazu Code vorhanden ist.
betonmoewe
User
Beiträge: 4
Registriert: Donnerstag 29. Oktober 2015, 20:12

@Alfons

vielen vielen Dank für Deine wirklich ausführlichen Erklärungen! Ich war schon sehr frustriert ...
Wahrscheinlich hatte ich auch sehr naive Vorstellungen/Erwartungen (so ala Xcode, wo man mit recht einfachen Mitteln sich eine GUI zusammenklicken kann und die Codebasis schon gleich miterzeugt wird).
Auf jeden Fall haben mich Deine Erläuterungen erst einmal ein Stück weitergebracht


Die
immernochpythonGUIAnfängerBetonmöwe
betonmoewe
User
Beiträge: 4
Registriert: Donnerstag 29. Oktober 2015, 20:12

@Alfons

Sorry, dass ich Dich nochmal nerven muss, ich blick's aber irgendwie immer noch nicht ... :(

im GUIDesigner funktioniert alles, aber ... wie bekomme ich nun daraus ein eigenständiges Programm ????

Als export habe ich dann zwar wieder die GUI Elemente, aber die Funtion ist wieder weg ...

Gruß

die etwas ratlose Betonmöwe
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sorry, dass ich die Dokumentation noch nicht fertig habe. Könnte morgen fertig sein.

Drei Arten Dein Script zu starten:

Code: Alles auswählen

# Möglichkeit 1: ganz am Anfang im link
import DynTkInter as tk
tk.Tk(link='mygui.py').mainloop()

# Möglichkeit 2: durch Laden - der sogenannte normale Weg
import DynTkInter as tk
root = tk.Tk()
tk.DynLoad('mygui.py')
root.mainloop()

# Möglichkeit 3: timer getriggert nach Start von mainloop - empfehlenswert bei PanedWindow Sash Einstellungen (die funktionieren nämlich erst nach Start von mainloop)
import DynTkInter as tk
tk.Tk().mainloop('mygui.py')
betonmoewe
User
Beiträge: 4
Registriert: Donnerstag 29. Oktober 2015, 20:12

ok, ok ...

langsam sehe ich Licht am Ende des Tunnels ;)


Wie wäre es denn mit so 2 - 3 kleinen Beispielprogrammen (von einfach (wie z.B. ein HelloWorld mit Button und Ausgabe) bis eher etwas komplexer), wo die verschiedenen Möglichkeiten dargestellt werden ???

Ansonsten wirklich toll, was Du da erschaffen hast ...

Danke

Die Betonmöwe
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi Betonmöve, gute Idee.
Wenn ich mit der Doku fertig bin, kann ich gerne auch kleine Beispiele für die Programmmierung geben.
Antworten