======Einstieg in Tkinter====== Grafische Oberflächen bestehen aus sogenannten Widgets, die meist mit der Maus bedient werden und damit eine Aktion auslösen. Widgets können sein: Buttons, ein- und mehrzeilige Eingabefelder, Labels, List- und Comboboxen ... Das Programm läuft in einer "Endlosschleife" und wartet auf Nutzereingaben mit Maus und Tastatur, mit den Aktionen ausgelöst werden, u.a. auch das Beenden des Programms. =====Ein erstes Beispiel===== # Tkinter wird importiert import tkinter # Funktion zum beenden des Programms. def ende(): main.destroy() # Das Hauptfenster wird erzeugt. main = tkinter.Tk() # Ein Button wird erzeugt. # Dem Button wird die Funktion ende() zugeordnet. b = tkinter.Button(main, text = "Beenden", command = ende) # Der Button wird zum Hauptfenster hinzugefügt. b.pack() # Die Hauptschleife wird gestartet. main.mainloop() * Mit ''%%import tkinter%%'' wird die Tkinter-Bibliothek importiert. * Die Funktion ''%%ende()%%'' beendet die Hauptschleife des Programms und zerstört das Tk-Objekt. * Mit ''%%main = tkinter.Tk()%%'' wird ein Objekt der Klasse Tk erzeugt. Es repräsentiert das Hauptfenster des Programms. * Mit ''%%b = tkinter.Button(main, text = "Beenden", command = ende)%%'' wird ein Objekt vom Typ Button (ein Widget) erzeugt. Das Elternobjekt ist ''%%main%%'', also das Hauptfenster. Die Aufschrift des Buttons (Eigenschaft ''%%text%%'') ist "Beenden". Dem Button ist die Funktion ende() zugeordnet (''%%command=ende%%''), d.h. wenn der Button mit der Maus gedrückt wird (Hauptaktion des Buttons), wird die Funktion Ende aufegrufen und das Programm beendet. * Mit ''%%b.pack()%%'' wird der Button zum Hauptfenster hinzugefügt. * Mit ''%%main.mainloop()%%'' wird das Hauptfenster des Programms erzeugt und die Hauptschleife gestartet. Das Programm wartet jetzt auf Maus- und Tastaturaktionen, bis es beendet wird. Das Programmfenster sieht eher unspektakulär aus: {{ :python:tkinter:einstieg.png?nolink |}} **Aufgabe 1** Teste das Programm! Verändere die Aufschrift des Buttons! =====Weitere einfache Widgets===== Bisher haben wir das Widget **Button** kennengelernt. Durch einen Mausklick auf einen Button können wir bestimmte Aktionen ausführen. Damit wir einfache Programme schreiben können lernen wir in diesem Abschnitt noch weitere Widgets kennen. **Labels** sind Beschriftungsflächen in einem Programm. Sie können Text und Bilder enthalten. **Entries** sind einzeilige Eingabefelder, auf deren Inhalt mit der Methode ''%%get()%%'' zugegriffen werden kann. Im Programm werden einige Eigenschaften dieser Widgets verändert. Diese Eigenschaften sind in einen [[https://www.w3schools.com/python/python_dictionaries.asp | Dictionary]] implementiert und man kann mit Hilfe des Schlüssels (Name der Eigenschaft) darauf zugreifen. Bei den einzelnen Widgets sind das jeweils die folgenden Eigenschaften: [[https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/button.html | Button]] : command, text [[https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/entry.html | Entry]]: width, text [[https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/label.html | Label]]: font, anchor, text Über die Links gelangt man zu einer Übersicht aller Eigenschaften der Widgets. Bisher fügen wir unsere Widgets mit der Methode ''%%pack()%%' zum Hauptfenster hinzu. Im nächsten Abschnitt werden wir bessere Möglichkeiten zum Anordnen der Widgets kennenlernen. Im folgenden Programm wird über die Kommentare beschrieben, wie die Widgets eingesetzt werden. # Tkinter wird importiert import tkinter # Funktion zum Beenden der Hauptschleife def ende(): main.destroy() # Funktion zum Berechnen des Ergebnisses def ausrechnen(): # Die Zeichenkette aus dem Eingabefeld wird in der Variable eingabe abgespeichert eingabe = eEingabe.get() # Es wird versucht die Zeichenkette in eine Kommazahl umzuwandeln. try: zahl = float(eingabe) # Wenn das Umwandeln erfolgreich ist wird die Texteigenschaft des Ergenislabels geändert: # Es wird die Quadratzahl berechnet und das Ergebnis wird als Zeichenkette angehängt lErgebnis["text"] = "Ergebnis: "+str(zahl * zahl) except: # Wenn die Eingabe keine Zahl war, wird die Eigenschaft text des Ergebnislabels geändert: # Ausgabe: Bitte eine Zahl eingeben! lErgebnis["text"] = "Bitte eine Zahl eingeben!" # Das Hauptfenster wird erzeugt main = tkinter.Tk() # Ein Label für die Überschrift mit dem Text Quadratzahlen wird erzeugt lUeberschrift = tkinter.Label(main, text = "Quadratzahlen") # Die Schriftart des Labels wird geändert lUeberschrift["font"] = "Sans 16 bold" # Die Überschrift wird zum Hauptfenster hinzugefügt lUeberschrift.pack() # Ein Eingabefeld wird erzeugt. eEingabe = tkinter.Entry(main) # Das Eingabefeld wird zum Hauptfenster hinzugefügt. eEingabe.pack() # Ein Label für das Ergebnis wird erzeugt. lErgebnis = tkinter.Label(main, text = "Ergebnis: ") # Die Labelbreite wird auf 20 Zeichen gesetzt lErgebnis["width"] = 20 # Der Labeltext wird links ausgerichtet. lErgebnis["anchor"] = "w" # Das label wird zum Hauptfenster hinzugefügt. lErgebnis.pack() # Ein Button zum Ausrechnen mit der Aufschrift "Ausrechnen" wird erzeugt # und mit der Funktion ausrechnen() verknüpft. bAusrechnen = tkinter.Button(main, text = "Ausrechnen", command = ausrechnen) # Der Button wird zum Hauptfenster hinzugefügt. bAusrechnen.pack() # Ein Button zum Beenden mit der Aufschrift "Beenden" wird erzeugt # und mit der Funktion ende() verknüpft. bEnde = tkinter.Button(main, text = "Beenden", command = ende) # Der Button wird zum Hauptfenster hinzugefügt. bEnde.pack() # Die Hauptschleife wird gestartet. main.mainloop() {{ :python:tkinter:einfache_widgets.png?nolink |}} **Aufgabe 2** Teste das Programm. Verändere die Eigenschaften der Widgets! Überlege dir neue Möglichkeiten der Berechnung (z.B. die Wurzel einer Zahl)! **Aufgabe 3** Schreibe ein Tkinter-Programm für einen einfachen Taschenrechner! {{ :python:tkinter:aufgabe3.png?nolink |}}