Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter

Menu

To prawdziwa aplikacja prawie zawsze zaczyna się od menu u góry okna.

Prawdziwa aplikacja rzadko jest kompletna bez menu na górze okna. W Tkinter menu jest zbudowany z obiektu Menu:

menu.py
import tkinter as tk

root = tk.Tk()

def novyj_fajl():
    print(„Utwórz nowy plik...”)

menu_bar = tk.Menu(root)
fajl_menu = tk.Menu(menu_bar, tearoff=0)
fajl_menu.add_command(label=„Nowy”, command=novyj_fajl)
fajl_menu.add_separator()
fajl_menu.add_command(label=„Wyjście”, command=root.destroy)
menu_bar.add_cascade(label=„Plik”, menu=fajl_menu)

root.config(menu=menu_bar)
root.mainloop()
🔶 Schematyczny obraz (nie prawdziwy zrzut ekranu)
Plik
Edycja
Pomoc
Nowe
Otwórz...
Zapisz
Wyjście
Wygląd menu różni się w zależności od systemu operacyjnego
Rzeczywisty wygląd paska menu i otwartego menu zależy od systemu operacyjnego, Tk wersji i motywu – trasa nie jest w stanie konsekwentnie odtworzyć zrzutu ekranu tego elementu headless- we wszystkich środowiskach, więc używa schematu z precyzyjną strukturą (łańcuch znaków menu → element → otwórz menu → przedmioty → separator), zamiast fotograficznego zrzutu ekranu.
tearoff=0
Domyślnie Tkinter dodaje na początku każdego menu linię przerywaną, pozwalającą „odłączyć” menu do osobnego okna. tearoff=0 wyłącza właśnie tę możliwość odrywania menu — jeśli w twoim interfejsie nie jest ona potrzebna (a zwykle nie jest), jest to częsty i świadomy wybór, a nie uniwersalna zasada „zawsze tak rób”.

root.quit() kontra root.destroy()

MetodaCo robi
root.quit()zatrzymuje obecne mainloop() — ale okno i widgety pozostają
root.destroy()niszczy okno i całe drzewo widżetów, a także zatrzymuje mainloop()
Nie są to synonimy wymienne
root.quit() pyta o prąd mainloop() zakończyć jest sam obiekt root i widgety nie są niszczone. root.destroy() idzie dalej: niszczy drzewo widgetów i samo okno, co również zatrzymuje mainloop(). Żaden z nich nie kończy samego procesu Python — po powrocie z mainloop() kod teoretycznie może być kontynuowany (np. coś zapisać przed wyjściem); proces kończy się później, naturalnie, jeśli po tym po prostu nie pozostanie kodu. Dla zwykłego punktu menu „Wyjście” w tym kursie jest to bardziej zrozumiałe i niezawodne root.destroy.

Akceleratory — to napis, nie przypisanie klawiszy

accelerator.py
fajl_menu.add_command(label=„Ratuj”, accelerator="Ctrl+S", command=sohranit)
accelerator sam w sobie nie tworzy skrótu klawiszowego
accelerator="Ctrl+S" wyświetla tylko tekst tooltipu obok elementu menu. On nie automatycznie przypisuje skrót klawiaturowy do polecenia — wymaga to osobnego mechanizmu wiązania zdarzeń (.bind(...)), który zostanie szczegółowo omówiony w rozdziale 17.
Praktyka: Zbuduj menu aplikacji
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →