Dodawanie menu do programu w tkinter

Stronę tą wyświetlono już: 256 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:

Listing 1
  1. import tkinter as tk
  2. class Application:
  3. def __init__(self):
  4. self.window = tk.Tk()
  5. self.window.title("Dodawanie menu")
  6. self.window.geometry("500x500")
  7. 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
  8. self.option_write.place(x = 10, y = 10)
  9. self.menu = tk.Menu(self.window) # tworzenie menu
  10. cascade = tk.Menu(self.menu) # tworzenie kaskady menu
  11. self.menu.add_cascade(label="Program", menu = cascade) # dodanie kaskady do menu głównego
  12. cascade.add_command(label = "opcja 1", command = self.option1) # dodanie pierwszej opcji do podmenu
  13. cascade.add_command(label = "opcja 2", command = self.option2) # drugiej opcji
  14. cascade2 = tk.Menu(cascade, tearoff = 0) # dodanie kaskady do podmenu
  15. cascade.add_cascade(label = "Podmenu", menu = cascade2) # przypisanie kaskady do podmenu
  16. cascade2.add_radiobutton(label = "opcja 1", command = self.suboption1) # dodaję opcję radiobutton
  17. cascade2.add_radiobutton(label = "opcja 2", command = self.suboption2) # dodaję kolejny radiobutton
  18. cascade2.add_separator()
  19. cascade2.add_checkbutton(label = "opcja 3", command = self.suboption3) # dodaję chceckbox-a
  20. self.window.config( menu = self.menu) # na koniec przypisuję menu do okna programu
  21. self.window.bind("<Button-1>", self.menuPost) # podpinam metodę menuPost pod lewy przycisk myszy
  22. self.window.mainloop()
  23. def option1(self):
  24. self.option_write.config(text = "Opcja 1")
  25. def option2(self):
  26. self.option_write.config(text = "Opcja 2")
  27. def suboption1(self):
  28. self.option_write.config(text = "Podopcja 1")
  29. def suboption2(self):
  30. self.option_write.config(text = "Podopcja 2")
  31. def suboption3(self):
  32. self.option_write.config(text = "Podopcja 3")
  33. def menuPost(self, event):
  34. self.menu.post(event.x_root, event.y_root) # wyświetlam menu w oknie programu po kliknięciu lewego przycisku myszy (menu kontekstowe)
  35. 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.

Wycinek widoki programu z menu utworzonym przy użyciu modułu tkinter
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.

Komentarze