Tkinter – Widgets

Dieses Kapitel stellt die grundlegenden Tk-Widgets vor, die Sie in fast jeder Benutzeroberfläche finden: Rahmen, Beschriftungen, Schaltflächen, Prüfschaltflächen, Optionsfelder, Einträge und Kombinationsfelder. Am Ende werden Sie wissen, wie Sie alle Widgets verwenden, die Sie jemals für eine typische Benutzeroberfläche vom Typ „Ausfüllen des Formulars“ benötigen. Es ist am einfachsten, dieses Kapitel (und die folgenden, die weitere Widgets behandeln) der Reihe nach zu lesen. Da es so viele Gemeinsamkeiten zwischen vielen Widgets gibt, werden wir bei der Beschreibung eines Widgets bestimmte Konzepte einführen, die auch für ein Widget gelten, das wir später beschreiben. Anstatt mehrmals über denselben Grund zu gehen, beziehen wir uns auf die Einführung des Konzepts.

  • button = Schaltfläche
  • canvas = Graphik-Fläche
  • checkbutton = Options-Feld
  • combobox = Auswahl-Box
  • entry = Eingabefeld
  • frame Fenster-Bereich = Container für andere Objekte
  • label = Beschriftung(sfeld)
  • labelframe
  • listbox = Listen-Feld
  • menu = Menü
  • menubutton = Menü-Eintrag
  • message = Text-Feld
  • notebook
  • panedwindow
  • progressbar
  • radiobutton = Auswahl-Feld
  • scale = Gleiter
  • scrollbar = (Bild-)Laufleiste
  • separator = Fenster-Teiler
  • sizegrip
  • spinbox
  • text = Text-Feld
  • treeview
  • tk_option = Menu


Für die Integration in das Windows-System werden die klassischen System-Fenster bereitgestellt. Dazu gehören:

tk_chooseColor
tk_chooseDirectory
tk_dialog
tk_getOpenFile
tk_getSaveFile
tk_messageBox
tk_popup
toplevel

Geometrie-Manager organisieren die Anordnung der Bedien-Elemente im Fenster / auf der Fensterfläche


Tk-Geometrie-Manager
pack –> einfache Geometrie, Objekte werden vorrangig untereinander angeordnet
grid –> Gitter- bzw. Tabellen-orientierte Geometrie; Objekte werden an GitterPlätzen innerhalb des Fensters angeordnet (Spalten: 0 bis x; Zeilen: 1 .. y)
place –> genaue (absolute) oder relative Platzierung der Objekte

Frames

Ein Frame ist ein Widget, das als einfaches Rechteck angezeigt wird. Frames helfen bei der Organisation Ihrer Benutzeroberfläche, oft sowohl visuell als auch auf Codierungsebene. Frames fungieren oft als Master-Widgets für einen Geometriemanager wie Grid, der die im Frame enthaltenen Slave-Widgets verwaltet. Rahmen bilden „Container“ für GUI-Komponenten. Mit dem master-Attribut wird die Zugehörigkeit zu einem solchen „Container“ festgelegt. Hierdurch ergibt sich eine sog. Master-Slave-Hierarchie.

Einfaches Frame Fenster

from tkinter import *
import tkinter as tk
def hello():
        print ("Hallo")
fenster=Tk()
frame1 = Frame(fenster, width=200, height=200)
frame2 = Frame(fenster)
fenster.title("tkinter Frame")

frame1.pack()
frame2.pack()
fenster.mainloop()

Hier ist die einfache Syntax, um dieses Widget zu erstellen −

w = Frame ( master, option, ... )

Parameter master − Dies repräsentiert das übergeordnete Fenster.
Optionen

Ein einfaches Beispiel:

Dieses Bild hat ein leeres Alt-Attribut. Der Dateiname ist frame.png
from tkinter import *
import tkinter as tk
def hello():
        print ("Hallo")
fenster=Tk()
frame1 = Frame(fenster, width=200, height=200)
frame2 = Frame(fenster)
fenster.title("tkinter Frame")
redbutton=Button(frame1, text="Exit", fg="red")
redbutton.pack()
blackbutton=Button(frame2, text="Berechnung",fg="black")
blackbutton.pack()
frame1.pack()
frame2.pack()
fenster.mainloop()

Das Fenster kann über quit geschlossen werden:

try:
    import Tkinter as tk
except:
    import tkinter as tk

root = tk.Tk()
root.geometry("200x250")

button = tk.Button(text = "Click and Quit", command = root.quit)
button.pack()

root.mainloop()

Ein Label ist eine Tkinter-Widget-Klasse, die verwendet wird, um Text oder ein Bild anzuzeigen. Das Label ist ein Widget, das der Benutzer nur anzeigt, aber nicht damit interagiert.

from tkinter import *

try:
    import Tkinter as tk
except:
    import tkinter as tk

root = tk.Tk()
root.geometry("200x250")
w=Label(root, text="Herzlich Willkommen")
w.pack()
button = tk.Button(text = "Click and Quit", command = root.quit)
button.pack()
root.mainloop()

Hier wird das Label mit der Farbe rot hinterlegt

from tkinter import *

try:
    import Tkinter as tk
except:
    import tkinter as tk

root = tk.Tk()
root.geometry("200x150")
Absatz1=Label(root)
Absatz1.pack()
w=Label(root, text="Herzlich Willkommen", bg="red", width=16)
w.pack()
Absatz2=Label(root)
Absatz2.pack()
button = tk.Button(text = "Click and Quit", command = root.quit)
button.pack()
root.mainloop()

Das Hinzufügen eines Bildes in das Fenster

Es muss natürlich angegeben werden wo das Bild gespeichert ist:

logo=PhotoImage(file="../../../home/michi/handarbeiten/kruemelmonster-klein.png")

Dann kann durch Angabe der festgelegten Variable angegeben werden das das Bild angezeigt werden soll. Der „justify“-Parameter kann dazu benutzt werden den Text links (LEFT) oder rechts (RIGHT) zu positionieren oder mittels CENTER zu zentrieren.
Wenn die compound-Option auf LEFT, RIGHT, TOP oder BOTTM gesetzt wird, wird das Bild entsprechend links, rechts, oberhalb oder unterhalb vom Text gesetzt.

from tkinter import *

try:
    import Tkinter as tk
except:
    import tkinter as tk

root = tk.Tk()
root.geometry("300x300")
logo=PhotoImage(file="../../../../home/michi/python/kruemelmonster.png")
w=Label(root,compound=CENTER,image=logo)
w.pack()
root.mainloop()

Eingabefeld

Bei einem Entry-Widget oder Eingabefeld handelt es sich um ein Tkinter-Objekt, mit dessen Hilfe beliebiger Text, also ein beleibiger String, in einem einzieligen Eingabefeld vom Benutzer einer Applikation eingegeben werden kann. Falls der Benutzer einen Text eingibt, der mehr Zeichen enthält, als dem Raum des Eingabefeldes entspricht, wird der Text verschoben. Das bedeutet, dass die Anfangsbuchsten des Strings in der Darstellung verschwinden. Mit den Pfeiltasten kann man wieder den Anfang sehen, indem man nach links geht.

Möchte man mehr als eine Zeile Text eingeben, so ist dieses Widget ungeeignet. Man sollte statt dessen ein Text-Widget benutzen.

e1=Entry(root)
e2=Entry(root)
e1.pack()
e2.pack()

Kompletter Code:

from tkinter import *

try:
    import Tkinter as tk
except:
    import tkinter as tk

root = tk.Tk()
root.geometry("300x300")
logo=PhotoImage(file="../../../../home/michi/python/kruemelmonster.png")
w=Label(root,compound=CENTER,image=logo)
w.pack()
e1=Entry(root)
e2=Entry(root)
e1.pack()
e2.pack()
button=tk.Button(text="Exit", command=root.quit)
button.pack()
root.mainloop()

Damit man mit den eingeben Werten arbeiten kann wird die get-Methode benötigt.

Ein mehrfaches Eingabefeld kann über text festgelegt werden.

from tkinter import *
import tkinter as tk
hauptfenster=tk.Tk()
mehrzeiliger_text=Text()
mehrzeiliger_text.pack()
hauptfenster.mainloop()