Dodawanie menu do programu w tkinter
Stronę tą wyświetlono już: 1047 razy
Menu jest częstym elementem wielu aplikacji, tak więc przydałoby się nauczyć jak takie menu wstawić do swojego programu utworzonego za pomocą modułu tkinter. Oto prosty przykład pokazujący proces tworzenia takiego menu:
- import tkinter as tk
- class Application:
- def __init__(self):
- self.window = tk.Tk()
- self.window.title("Dodawanie menu")
- self.window.geometry("500x500")
- self.option_write = tk.Label(self.window, text = "nie wybrano rzadnej opcji") # pomocnicza kontrolka typu label, która będzie wyświetlała jaki element menu został kliknięty
- self.option_write.place(x = 10, y = 10)
- self.menu = tk.Menu(self.window) # tworzenie menu
- cascade = tk.Menu(self.menu) # tworzenie kaskady menu
- self.menu.add_cascade(label="Program", menu = cascade) # dodanie kaskady do menu głównego
- cascade.add_command(label = "opcja 1", command = self.option1) # dodanie pierwszej opcji do podmenu
- cascade.add_command(label = "opcja 2", command = self.option2) # drugiej opcji
- cascade2 = tk.Menu(cascade, tearoff = 0) # dodanie kaskady do podmenu
- cascade.add_cascade(label = "Podmenu", menu = cascade2) # przypisanie kaskady do podmenu
- cascade2.add_radiobutton(label = "opcja 1", command = self.suboption1) # dodaję opcję radiobutton
- cascade2.add_radiobutton(label = "opcja 2", command = self.suboption2) # dodaję kolejny radiobutton
- cascade2.add_separator()
- cascade2.add_checkbutton(label = "opcja 3", command = self.suboption3) # dodaję chceckbox-a
- self.window.config( menu = self.menu) # na koniec przypisuję menu do okna programu
- self.window.bind("<Button-1>", self.menuPost) # podpinam metodę menuPost pod lewy przycisk myszy
- self.window.mainloop()
- def option1(self):
- self.option_write.config(text = "Opcja 1")
- def option2(self):
- self.option_write.config(text = "Opcja 2")
- def suboption1(self):
- self.option_write.config(text = "Podopcja 1")
- def suboption2(self):
- self.option_write.config(text = "Podopcja 2")
- def suboption3(self):
- self.option_write.config(text = "Podopcja 3")
- def menuPost(self, event):
- self.menu.post(event.x_root, event.y_root) # wyświetlam menu w oknie programu po kliknięciu lewego przycisku myszy (menu kontekstowe)
- app = Application()
Na poniższym rysunku widoczny jest widok wycinka okna programu z dodanym menu. Warto zwrócić uwagę na przerywaną linię na górze menu, po której kliknięciu menu jest odrywane i wyświetlane w oddzielnym oknie.

Rys.
1
Wycinek widoki programu z menu utworzonym przy użyciu modułu tkinter. Widoczna u góry linia jest spowodowana tym, że w linijce 14 opcja tearoff nie została ustawiona na 0. Kliknięcie na przerywanej linii powoduje oderwanie menu i wyświetlenie go w oddzielnym okienku.
To samo menu można wywołać jako menu kontekstowe klikając lewym przyciskiem myszy w obszarze okna programu, co jest spowodowane podpięciem pod to zdarzenie metody menuPost. W tejże metodzie wywoływane jest menu w danym punkcie ekranu dzięki metodzie post.