tkinter - Optionen

Optionen

Setzen und Abfragen von Optionen

Alle Widgets werden über Optionen konfiguriert. ttk- und tk-Widgets haben teilweise unterschiedliche Optionen.

Die folgenden Schreibweisen zum Setzen der Option text sind gleichwertig:

button = ttk.Button(parent, text='Klick mich bitte!')
button["text"] = 'Klick mich bitte!'
button.configure(text='Klick mich bitte!')

Man erhält mit button.cget('text') den aktuellen Wert der Option text des Widgets button.

Allgemeine Optionen

OptionsnameBeschreibung
class_Widgetklasse, dient beispielsweise als Gruppenname für gemeinsame Befehle.
commandEinige Widgets, wie etwa ttk.Button, können Ereignisse auslösen. In diesem Fall wird ein Callback aufgerufen, dessen Namen man mit dieser Option setzen kann. Callbacks von Widgets haben keine Parameter
cursorFestlegen eines Mauszeigers
takefocus0 oder 1, legt fest, ob das Widget den Fokus akzeptiert.
stateKompatibilitätsoption für tk-Widgets, siehe auch Beschreibung für Zustände
styleeinen Style auf dieses Widget anwenden, nur für ttk-Widgets
placeholderFür Entries, es wird ein Text als Platzhalter eingefügt (Ab tk 8.7 für ttk-Widgets unterstützt)
placeholderforeground Vordergrundfarbe des Platzhalters (Ab tk 8.7 für ttk-Widgets unterstützt)

Labeloptionen

Dieses gilt für ttk.Button und ttk.Label gleichermaßen

OptionsnameBeschreibung
compoundHat man gleichzeitig ein Bild und einen Text in einem Widget anzuzeigen, legt compound die relative Lage der zwei Elemente fest:
  • tk.TOP – Bild über Text,
  • tk.BOTTOM – Bild unter Text,
  • tk.LEFT – Bild links neben Text und
  • tk.RIGHT – Bild rechts neben Text.
compound muss man angeben, wenn Bild und Text vorkommen.
fontAngabe eines Fonts
foregroundVordergrundfarbe
imageAngabe eines Bildes
justifyMehrzeiligen Text ausrichten: tk.LEFT, tk.CENTER, tk.RIGHT
paddingzusätzlicher innerer Abstand zum Text oder Bild
textDer Text eines Labels oder Buttons. textvariable hat Vorrang vor text
textvariableDer Inhalt der Variablen gibt den Inhalt des Widgets an
underlineGibt den Index desjenigen Buchstaben an, der unterstrichen werden soll
widthLegt feste Breite fest
wraplengthMaximale Zeilenlänge in Pixel oder einer anderen Einheit, ab der umgebrochen wird. Werte kleiner gleich 0 bedeuten keinen Umbruch.

Das folgende Programm zeigt die Auswirkung der Option padding:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry('200x200')
        self._createWidgets()

    def _createWidgets(self):
        label1= ttk.Label(text='Label1', relief=tk.SUNKEN, padding=0)
        label1.pack(expand=tk.YES, fill=tk.BOTH)

        label2= ttk.Label(text='Label2', relief=tk.SUNKEN, padding=10)
        label2.pack(expand=tk.YES, fill=tk.BOTH)

        label3= ttk.Label(text='Label3', relief=tk.SUNKEN, padding=50)
        label3.pack(expand=tk.YES, fill=tk.BOTH)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Scrolloptionen

Optionen für das Zusammenspiel mit Scrollbars

OptionsnameBeschreibung
xscrollcommandxscrollcommand eines Widgets wird mit der s.set(…)-Methode einer Scrollbar (horizontal) verknüpft
yscrollcommandyscrollcommand eines Widgets wird mit der s.set(…)-Methode einer Scrollbar (vertikal) verknüpft

Folgendes reduzierte Beispiel zeigt, wie es funktioniert:

listbox= tk.Listbox(…)
scrollX = ttk.Scrollbar(parent, orient=tk.HORIZONTAL, command=listbox.xview)
scrollY = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=listbox.yview)

listbox['xscrollcommand'] = scrollX.set
listbox['yscrollcommand'] = scrollY.set

Rahmenoptionen

OptionsnameBeschreibung
borderwidthBreite des Randes, für relief benötigt
reliefRahmenart, borderwidth muss ebenfalls gesetzt werden: tk.FLAT, tk.GROOVE, tk.RAISED, tk.RIDGE, tk.SOLID und tk.SUNKEN

Beispiel:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x300")
        self._createWidgets()

    def _createWidgets(self):
        label1 = ttk.Label(self, relief=tk.FLAT, text="tk.FLAT");
        label1.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        label2 = ttk.Label(self, relief=tk.GROOVE, text="tk.GROOVE");
        label2.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        label3 = ttk.Label(self, relief=tk.RAISED, text="tk.RAISED");
        label3.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        label4 = ttk.Label(self, relief=tk.RIDGE, text="tk.RIDGE");
        label4.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        label5 = ttk.Label(self, relief=tk.SOLID, text="tk.SOLID");
        label5.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        label6 = ttk.Label(self, relief=tk.SUNKEN, text="tk.SUNKEN");
        label6.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)
        button = ttk.Button(self, text='Quit', command=self.destroy)
        button.pack(expand=tk.YES, fill=tk.BOTH, padx=2, pady=2)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Highlightoptionen (nur tk-Widgets)

tk Widgets haben einen Highlightrahmen. Diesen Rahmen kann man farblich markieren. Der Rahmen kann seine Farbe ändern, wenn das Widget den Input-Fokus erhält, also beispielsweise wenn die Option takefocus zusätzlich gesetzt wurde.

OptionsnameBeschreibung
highlightbackgroundHintergrundarbe des Highlight-Rahmens, wenn das Widget keinen Input-Fokus hat
highlightcolorHintergrundarbe des Highlight-Rahmens, wenn das Widget Input-Fokus hat
highlightthicknessBreite des Highlightrahmens

Um die Färbung im folgenden Beispiel zu sehen, kann man per TAB-Taste zwischen den Widgets wechseln:

Bild der Anwendung
import tkinter as tk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry('600x500')
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=2)
        self.grid_rowconfigure(1, weight=2)
        self.grid_rowconfigure(2, weight=1)
        
        msg1 = tk.Message(self,
                          background='black',
                          fg='white',
                          highlightbackground='green',
                          highlightcolor='yellow',
                          highlightthickness=5,
                          takefocus=tk.YES)
        msg1['text']='Beispieltext\n#1'
        msg1.grid(column=0, row=0, sticky=tk.W+tk.E+tk.N+tk.S)
        msg2 = tk.Message(self,
                          background='black',
                          fg='white',
                          highlightbackground='green',
                          highlightcolor='yellow',
                          highlightthickness=5,
                          takefocus=tk.YES)
        msg2['text']='Beispieltext\n#2'
        msg2.grid(column=0, row=1, sticky=tk.W+tk.E+tk.N+tk.S)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Anker (anchor)

Anchor als Option hat verschiedene Bedeutungen in tkinter.

Tkinter kennt Konstanten (Himmelsrichtungen) für den Anker: tk.NW, tk.N, tk.NE, tk.W, tk.CENTER, tk.E, tk.SW, tk.S und tk.SE

Dimensionen

Dimensionsangaben

Numerische Angaben zu Optionen können sowohl in Pixel wie auch in anderen Einheiten angegeben werden:

Beispiel:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x300")
        self._createWidgets()
        
    def _createWidgets(self):
        self.label1 = ttk.Label(self, relief=tk.GROOVE, text="1 Zentimeter");
        self.label1.place(x=10, y='1c')
 
        self.label2 = ttk.Label(self, relief=tk.GROOVE, text="2 Inch");
        self.label2.place(x=10, y='2i')
 
        self.label3 = ttk.Label(self, relief=tk.GROOVE, text="30 mm");
        self.label3.place(x=10, y='30m')
 
        self.label4 = ttk.Label(self, relief=tk.GROOVE, text="10 Printers Points");
        self.label4.place(x=10, y='10p')
 
        self.quit = ttk.Button(self, text='Quit', command=self.destroy)
        self.quit.place(x=100,y=100)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Farben

Farbangaben

Farben können auf verschiedene Weisen notiert werden:

Beispiel:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x300")
        self._createWidgets()
        
    def _createWidgets(self):
        label1 = ttk.Label(self, relief=tk.GROOVE, text="Ich bin rot", background='red');
        label1.pack(fill=tk.BOTH, expand=tk.YES)
        label2 = ttk.Label(self, relief=tk.GROOVE, text="Ich bin blau", background='#00F');
        label2.pack(fill=tk.BOTH, expand=tk.YES)
        label3 = ttk.Label(self, relief=tk.GROOVE, text="Ich bin grün", background='#00aa00');
        label3.pack(fill=tk.BOTH, expand=tk.YES)
        label4 = ttk.Label(self, relief=tk.GROOVE, text="Ganz Weiß", background='#fffffffff');
        label4.pack(fill=tk.BOTH, expand=tk.YES)
        
        button = ttk.Button(self, text='Quit', command=self.destroy)
        button.pack()

if __name__ == '__main__':
    window = A()
    window.mainloop()

Font

Font als Tupel

Ein Font kann beschrieben werden als ein Tupel aus Familie, Größe und Optionen. Beispiele sind ('Helvetica', 10, 'bold') und ('Courier', 20, font.BOLD, font.ITALIC).

Beispiel:

Bild der Anwendung
import tkinter as tk
import tkinter.font as font
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x300")
        self._createWidgets()
 
    def _createWidgets(self):
        label1 = ttk.Label(self, anchor=tk.CENTER, text="Helvetica 10",
                           font=('Helvetica', 10));
        label1.pack(fill=tk.BOTH, expand=tk.YES)
        label2 = ttk.Label(self, anchor=tk.CENTER, text="Helvetica 20",
                           font=('Helvetica', 20));
        label2.pack(fill=tk.BOTH, expand=tk.YES)
        label3 = ttk.Label(self, anchor=tk.CENTER, text="Helvetica 10 Bold",
                           font=('Helvetica', 10, font.BOLD));
        label3.pack(fill=tk.BOTH, expand=tk.YES)
        label4 = ttk.Label(self, anchor=tk.CENTER, text="Helvetica 10 Italic",
                           font=('Helvetica', 10, font.ITALIC));
        label4.pack(fill=tk.BOTH, expand=tk.YES)
        label5 = ttk.Label(self, anchor=tk.CENTER, text="Helvetica 10 Bold+Italic",
                           font=('Helvetica', 10, font.BOLD, font.ITALIC));
        label5.pack(fill=tk.BOTH, expand=tk.YES)
        button = ttk.Button(self, text='Quit', command=self.destroy)
        button.pack()

if __name__ == '__main__':
    window = A()
    window.mainloop()

Fontobjekt

Ein Fontobjekt lässt sich mit font.Font(root=None, font=None, name=None, exists=False, **options) erzeugen. Die Parameter bedeuten:

OptionsnameBeschreibung
familyFontfamilie, mögliche Werte: 'Bahnschrift Light', 'Courier', 'Times New Roman'… Mit font.families() erhält man eine Tupel von dem System bekannten Fontfamilien
overstrikeDurchsteichen, mögliche Werte: 0 oder 1
sizeGröße des Fonts. Positive Werte werden in „Punkten“ gemessen, bei negativen Werten wird der Absolutbetrag in Pixeln gemessen
slantKursivschrift, font.ITALIC, font.ROMAN
weightFontgewicht, mögliche Werte: font.NORMAL, font.BOLD
underlineUnterstreichen, mögliche Werte: 0 oder 1

Beispiel:

import tkinter as tk
import tkinter.font as font
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x200")
        self._createWidgets()

    def _createWidgets(self):
        f = font.Font(family='Courier', size=50)
        label1 = ttk.Label(self, anchor=tk.CENTER, text="Courier 20", font=f);
        label1.pack(fill=tk.BOTH, expand=tk.YES)
        
        button = ttk.Button(self, text='Quit', command=self.destroy)
        button.pack()

if __name__ == '__main__':
    window = A()
    window.mainloop()

Für einen gegebenen Font f gibt es die folgenden Methoden:

FontmethodenBeschreibung
f.actual(option=None, displayof=None) Fontattribute werden zurückgegeben. Dictionary mit den Schlüsseln: 'family', 'size', 'weight', 'slant', 'underline' und 'overstrike'
f.cget(option)Ein bestimmtes Attribut wird zurückgegeben
f.config(**options)Optionen werden konfiguriert
f.copy()Eine Kopie des Fonts (neues Objekt) wird zurückgegeben
f.measure(text, displayof=None)Vermisst einen Text mit dem Font
f.metrics(*options, **kw)ascent: Höhe des Fonts von Basislinie bis zum höchsten Punkt des Fonts, descent: Höhe Basislinie bis zum tiefsten Punkt des Fonts, linespace: minimaler Zeilenabstand, damit Zeilen nicht überlappen, fixed: 1 oder 0

Weitere Fontmethoden

Das Fontmodul kennt die Funktionen:

FontfunktionBeschreibung
font.families(root=None, displayof=None)Tupel aller bekannten Fontfamilien
font.names(root=None)Liste von bekannten Fontnamen
font.nametofont(name, root=None)Gibt einen Font() zurück auf der Basis eines Fontnamen

Kontrollvariablen

Kontrollvariablen

Für die Kommunikation mit manchen Widgets werden Kontrollvariablen eingesetzt. Mit denen kann beispielsweise der Text eines Labels an anderer Stelle geändert werden.

Es gibt folgende Kontrollvariablen, die mit dem optionalen Parameter value vorbelegt werden können:

Zu diesen Kontrollvariablen gehören die Methoden var.get() sowie var.set(value)

Gebrauch:

Manche Widgets, wie Checkbutton, haben noch die Optionen onvalue und offvalue, um diese angegebenen Werte in der Variablen zu speichern: Einen Wert, der der Kontrollvariable als on- oder off-Wert übergeben wird.

import tkinter as tk
import tkinter.font as font
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x200")
        self._createWidgets()

    def _createWidgets(self):
        self._textVar = tk.StringVar(value='Drück mich bitte.')
        button1 = ttk.Button(self, textvariable=self._textVar, command=self._onPress)
        button1.pack(fill=tk.X, expand=tk.YES)
        
        button = ttk.Button(self, text='Quit', command=self.destroy)
        button.pack()

    def _onPress(self):
        self._textVar.set('Danke!')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Zustände

Zustand - state

Ein Widget kann in einem von vielen Zuständen sein. Für ttk-Widget sind diese Zustände:

Die Zustände werden mit Methoden wie instate(…) oder state(…) abgefragt / verändert.

Tk-Widgets kennen nur die States disabled, normal und readonly. Diese gibt man üblicherweise als Option state an und ändert sie mit w.configure(…)