tkinter - tk.Menu und ttk.Menubutton

tk.Menu erzeugen

menu = tk.Menu(parent, Optionen)
window['menu'] = menu

Die folgende Tabelle enthält die Menüoptionen zum Befehl tk.Menu()

OptionsnameBeschreibung
allgemeine tk-Widget-Optionen
activebackgroundHintergrundfarbe für aktive Elemente
activeborderwidthRahmenbreite für aktive Elemente
activeforegroundVordergrundfarbe für aktive Elemente
activereliefRahmenart für aktive Elemente, Siehe Rahmenoptionen
background, bgNormale Hintergrundfarbe
borderwidth, bdRahmenbreite
disabledforegroundVordergrundfarbe im state disabled
spezielle tk.Menu-Optionen
postcommandFunktion, die aufgerufen wird, wenn sich das Menu öffnet
selectcolorIndikatorfarbe für Check- oder Radiobuttonmenus
tearoff(Boolean) wenn tk.YES, dann enthält das Menu eine Tearoff-Zeile, so dass man das Menu abreißen kann. (default)
tearoffcommandFunktion, wird aufgerufen, wenn das Menü abgerissen wird
titleTitel des Fensters für ein eigenständiges, abgerissenes Menufenster
typemenubar, tearoff oder normal, nur interner Gebrauch

tk.Menu kennt außerdem die Standardoptionen: cursor, font, foreground (fg), relief und takefocus

menu = tk.Menu(parent, Optionen)
menu.add('command', label='Bearbeiten')
window['menu'] = menu

Die folgende Tabelle enthält Menüitemoptionen für den Befehl menu.add(…), der weiter unten vorgestellt wird

OptionsnameBeschreibung
acceleratorZeigt einen Accelerator an, beispielsweise accelerator='^C'. Accelerator muss noch per bind(…) hinzugefügt werden
activebackgroundHintergrundfarbei im Zustand tk.ACTIVE
activeforegroundVordergrundfarbe im Zustand tk.ACTIVE
backgroundHintergrundfarbe, nicht aktiviert
bitmapAnzeige einer Bitmap
columnbreakcolumnbreak==0: Eintrag erfolgt unterhalb des letzten Eintrags. Ist columnbreak==1, dann erscheint der Eintrag in einer neuen Spalte.
commandCallback
compoundPosition der Grafik, wenn Grafik und Text gleichzeitig erscheint: tk.BOTTOM, tk.CENTER, tk.LEFT, tk.NONE, tk.RIGHT, oder tk.TOP
fontausgewählter Font
foregroundVordergrundfarbe, wenn das Item nicht ausgewählt ist
hidemarginhidemargin=True: kein Rand um Item
imageBild für dieses Item
indicatoronFür Check- und Radiobuttons: (Boolean) True: Indicator wird angezeigt
labelText des Items
menuSubmenü
offvalueCheckbuttons: Wert, wenn er ausgeschaltet ist
onvalueCheckbuttons: Wert, wenn er eingeschaltet ist
selectcolorAuswahlfarbe für Check- und Radiobuttons, rot ist default
selectimageRadio- oder Checkbutton: Image für die Anzeige bei Auswahl
statetk.DISABLED (ausgegraut, deaktiviert), tk.ACTIVE: Aktiv, Maus über dem Eintrag, tk.NORMAL: Normale Ansicht
underlineIndex des unterstrichenen Buchstabens
valueRadiobutton: Dieser Wert wird in der Variablen gespeichert. Ist dieser Wert nicht angegeben, dann wird der Label-Text genommen
variableCheck- und Radiobutton: Kontrollvariable

Das folgende Programm stellt eine Menüleiste und einige Einträge in dieser Menüleiste vor. Das fileMenu enthält das exit-Menü, mit dem das Programm beendet wird:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

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

    def _createWidgets(self):
        menubar = tk.Menu(self)
        # Untermenu: Dateimenu
        fileMenu = tk.Menu(menubar, tearoff=tk.NO,
                           activebackground='black',
                           activeforeground='white')
        fileMenu.add('command', label='Öffnen')
        fileMenu.add('command', label='Schließen')
        fileMenu.add('separator')
        fileMenu.add('command', label='exit', command=self.destroy)
        # Dateimenu hinzufügen
        menubar.add('cascade', label='Datei', menu=fileMenu)
        # weitere Menus
        menubar.add('command', label='Bearbeiten')
        menubar.add('command', label='Werkzeuge')
        # Menubar im Fenster eintragen
        self['menu'] = menubar

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

Menü-Methoden

miOption sind die Menüitemoptionen aus obiger Tabelle.

Indextyp:

FunktionParameterRückgabewertBeschreibung
m.activate(index)index: Itemindex-Setzt den Menüeintrag mit gegebenem Index auf aktiv. Der aktive Eintrag kann mit m.index('active') abgefragt werden
m.add(mType, miOption, …)mType: 'cascade', 'checkbutton', 'command', 'radiobutton' oder 'separator',
miOption, …: Key-Value-Paare
-Fügt dem Menü ein neues Element hinzu
m.add_cascade(miOption, …)miOption aus obiger Tabelle, Key-Value-Paare- Fügt das Element ein
m.add_checkbutton(miOption, …)
m.add_checkbutton(miOption, …)
m.add_command(miOption, …)
m.add_radiobutton(miOption, …)
m.add_separator()--Fügt einen Separator ein
m.cget(Option) Siehe allgemeine Konfigurationsmethoden
m.clone(…)Nur interner Gebrauch
m.configure(Option…) Siehe allgemeine Konfigurationsmethoden
m.delete(index1, index2=index1)index1, index2: Itemindex-Löscht die Menüitems
m.entrycget(index, miOption)index: Itemindex miOption aus obiger TabelleWert der MenüitemoptionFragt den miOption-Wert des Items an der Stelle index ab
m.entryconfigure(index, miOption, …)index: Itemindex, miOption aus obiger Tabelle- Ändert den miOption-Wert des Items an der Stelle index
m.index(index)index: ItemindexZahl Gibt einen numerischen Index zum index (als Indextyp) zurück
m.insert(index, mType, miOption, …)index: Itemindex, sonst wie m.add(…)- Fügt einen neuen Menüeintrag vor index ein. Verhält sich sonst wie m.add(…)
m.insert_cascade(…)siehe m.insert(…) und m.add_cascade(…)
m.insert_checkbutton(…)siehe m.insert(…) und m.add_checkbutton(…)
m.insert_command(…)siehe m.insert(…) und m.add_command(…)
m.insert_radiobutton(…)siehe m.insert(…) und m.add_radiobutton(…)
m.insert_separator(…)siehe m.insert(…) und m.add_separator(…)
m.invoke(index)index: Itemindex- Callback des Menüeintrags an der Stelle index wird aufgerufen
m.post(x, y)x, y: Position-Zeigt das Menü an der Position (x, y) (Bildschirmkoordinaten!) an. Führt gegebenenfalls die Callback aus, die unter postcommand in den Menüoptionen angegeben wurde
m.postcascade(index)Noch nicht unterstützt?
m.type(index)index: Itemindex Itemtyp (tk.CASCADE, tk.CHECKBUTTON, tk.COMMAND, tk.RADIOBUTTON, tk.SEPARATOR oder 'tearoff') Gibt den Itemtyp des Menüeintrags am angegebenen Index zurück
m.unpost()--Klappt die mit post(…) oder per Maus geöffneten Untermenüs wieder zu. Funktioniert nicht unter MacOS und Windows
m.xposition(index)index: ItemindexPixelabstand Horizontaler Pixelabstand des Menüeintrags relativ zum Menüfenster
m.yposition(index)index: ItemindexPixelabstand Vertikaler Pixelabstand des Menüeintrags relativ zum Menüfenster

Das folgende Programm stellt Menüitems mit ihren Callbacks vor. Dabei werden Radiobuttons und Checkbuttons ebenfalls als Einträge benutzt:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

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

    def _createWidgets(self):
        menubar = tk.Menu(self)
        # Untermenu: Dateimenu
        fileMenu = tk.Menu(menubar, tearoff=tk.NO,
                           activebackground='black',
                           activeforeground='white')
        fileMenu.add_command(label='Öffnen',
                             command=lambda x='open':
                             self._onMenuClick(x))
        fileMenu.add_command(label='Schließen',
                             command=lambda x='close':
                             self._onMenuClick(x))
        fileMenu.add_separator()
        fileMenu.add_command(label='exit', command=self.destroy)

        # Untermenu: RadioMenu
        self.intVar = tk.IntVar(value=2)
        radioMenu = tk.Menu(menubar, tearoff=tk.NO,
                            activebackground='white',
                            activeforeground='black')
        radioMenu.add_radiobutton(label='Apfel', variable=self.intVar,
                                  value=1, command=self._onRadioClick)
        radioMenu.add_radiobutton(label='Birne', variable=self.intVar,
                                  value=2, command=self._onRadioClick)
        radioMenu.insert_radiobutton(1, label='egal', variable=self.intVar,
                                  value=3, command=self._onRadioClick)

        # Untermenu: CheckMenu
        self.c1Var = tk.IntVar(value=0)
        checkMenu = tk.Menu(menubar, tearoff=tk.NO)
        checkMenu.add_checkbutton(label='aufgeräumt', variable=self.c1Var,
                                  offvalue=0, onvalue=1,
                                  command=self._onCheck1Click)
        self.c2Var = tk.IntVar(value=1)
        checkMenu.add_checkbutton(label='Bad geputzt', variable=self.c2Var,
                                  offvalue=0, onvalue=1,
                                  command=self._onCheck2Click)
        
        # Untermenüs hinzufügen
        menubar.add_cascade(label='Datei', menu=fileMenu)
        menubar.add_cascade(label='RadioMenu', menu=radioMenu)
        menubar.add_cascade(label='Checkliste', menu=checkMenu)

        # Menubar im Fenster eintragen
        self['menu'] = menubar

    def _onMenuClick(self, value):
        print('Dateimenü geklickt:', value)

    def _onRadioClick(self):
        print('Radiobutton geklickt:', self.intVar.get())

    def _onCheck1Click(self):
        print('Checkbutton 1 geklickt:', self.c1Var.get())

    def _onCheck2Click(self):
        print('Checkbutton 2 geklickt:', self.c2Var.get())

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

ttk.Menubutton erzeugen

mb = ttk.Menubutton(parent, Optionen)
OptionsnameBeschreibung
spezielle ttk.Menubutton-Optionen
directionAngabe, wo das Menü positioniert werden soll: 'above', 'below' (default), 'left', 'right' oder 'flush' (direkt über dem Knopf).
menuDas tk.Menu, das angezeigt werden soll, wenn der Knopf betätigt wird. Das Menü sollte den Knopf als parent haben.

ttk.Menubutton kennt außerdem die Standardoptionen: class_, compound, cursor, image, state, style, takefocus, text, textvariable, underline und width

Es werden nur die Standardmethoden unterstützt:

ttk.Menubutton kennt den Style 'Toolbutton', wie unter ttk.Button#Toolbutton beschrieben.

Das folgende Programm verknüpft einen Menübutton mit einem Menü. Da das Menü den Menübutton als Parent haben soll, muss man erst den Menübutton und dann erst das Menü erstellen. Das Menü wird im Anschluss dem Button hinzugefügt.

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

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

    def _createWidgets(self):
        f = ttk.Frame(self, relief=tk.FLAT)
        f.pack(side=tk.TOP, fill=tk.X, expand=tk.NO, padx=2, pady=2)

        mb1 = ttk.Menubutton(f, text='Mein Menü', direction='flush')
        mb1.pack(side=tk.LEFT)
        # Menu erstellen, parent ist der Menubutton
        menu = tk.Menu(mb1, tearoff=tk.NO,
                       activebackground='black',
                       activeforeground='white')
        menu.add_command(label='Öffnen',
                         command=lambda x='open':self._onMenuClick(x))
        menu.add_command(label='Schließen',
                         command=lambda x='close':self._onMenuClick(x))
        menu.add_separator()
        menu.add_command(label='Exit', command=self.destroy)
        # Menu dem Menubutton hinzufügen
        mb1['menu'] = menubar

    def _onMenuClick(self, value):
        print('Dateimenü geklickt:', value)

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

Referenzen

Siehe Auch