Kontrolka Treeview w tkinter

Stronę tą wyświetlono już: 270 razy

Ta kontrolka umożliwia tworzenie rozgałęziające się listy zwijane. Jest często spotykana w programach do przeglądania zawartości folderów, w oknach dialogowych z zaawansowanym systemem ustawień programu. W końcu w programie Regedit systemu Windows, który służy do przeglądania rejestru systemowego. Nie ma co jednak gadać zbyt długo, lepiej poświęcić nieco swojego czasu i zerknąć łaskawym okiem na kod programu:

Listing 1
  1. import tkinter as tk
  2. import tkinter.ttk as ttk
  3. #import tkinter.messagebox as msb
  4. class Application:
  5. def __init__(self):
  6. self.window = tk.Tk()
  7. self.treeview = ttk.Treeview(self.window) # tworzenie kontrolki Treeview
  8. africa_countries = ['Algieria ', 'Angola ', 'Benin ', 'Botswana ', 'Burkina Faso ', 'Burundi ', 'Czad ', 'Demokratyczna Republika Konga ', 'Dżibuti ', 'Egipt ', 'Erytrea ', 'Etiopia ', 'Gabon ', 'Gambia ', 'Ghana ', 'Gwinea ', 'Gwinea Bissau ', 'Gwinea Równikowa ', 'Kamerun ', 'Kenia ', 'Komory ', 'Kongo ', 'Lesotho ', 'Liberia ', 'Libia ', 'Madagaskar ', 'Malawi ', 'Mali ', 'Maroko ', 'Mauretania ', 'Mauritius ', 'Mozambik ', 'Namibia ', 'Niger ', 'Nigeria ', 'Południowa Afryka ', 'Republika Środkowoafrykańska ', 'Republika Zielonego Przylądka ', 'Rwanda ', 'Senegal ', 'Seszele ', 'Sierra Leone ', 'Somalia ', 'Suazi ', 'Sudan ', 'Sudan Południowy ', 'Tanzania ', 'Togo ', 'Tunezja ', 'Uganda ', 'Wybrzeże Kości Słoniowej ', 'Wyspy Świętego Tomasza i Książęca ', 'Zambia ', 'Zimbabwe ']
  9. self.add_values(africa_countries, "Afryka") # tworzenie drzewa z gałęziami
  10. australia_and_oceania_countries = ['Australia ', 'Fidżi ', 'Kiribati ', 'Mikronezja ', 'Nauru ', 'Nowa Zelandia ', 'Palau ', 'Papua-Nowa Gwinea ', 'Samoa ', 'Tonga ', 'Tuvalu ', 'Vanuatu ', 'Wyspy Marshalla ', 'Wyspy Salomona']
  11. self.add_values(australia_and_oceania_countries, "Australia i Oceania") # metoda klasy, która doda całą gałąź drzewa do istniejącego już pnia
  12. asia_countries = ['Afganistan ', 'Arabia Saudyjska ', 'Armenia ', 'Azerbejdżan ', 'Bahrajn ', 'Bangladesz ', 'Bhutan ', 'Brunei ', 'Chiny ', 'Cypr ', 'Filipiny ', 'Gruzja ', 'Indie ', 'Indonezja ', 'Irak ', 'Iran ', 'Izrael ', 'Japonia ', 'Jemen ', 'Jordania ', 'Kambodża ', 'Katar ', 'Kazachstan ', 'Kirgistan ', 'Korea Południowa ', 'Korea Północna ', 'Kuwejt ', 'Laos ', 'Liban ', 'Malediwy ', 'Malezja ', 'Mjanma ', 'Mongolia ', 'Nepal ', 'Oman ', 'Pakistan ', 'Rosja ', 'Singapur ', 'Sri Lanka ', 'Syria ', 'Tadżykistan ', 'Tajlandia ', 'Timor Wschodni ', 'Turcja ', 'Turkmenistan ', 'Uzbekistan ', 'Wietnam ', 'Zjednoczone Emiraty Arabskie']
  13. self.add_values(asia_countries, "Azja")
  14. european_countries = ['Albania', 'Andora', 'Austria', 'Belgia', 'Białoruś', 'Bośnia i Hercegowina', 'Bułgaria', 'Chorwacja', 'Czarnogóra', 'Czechy', 'Dania', 'Estonia', 'Finlandia', 'Francja', 'Grecja', 'Hiszpania', 'Holandia', 'Irlandia', 'Islandia', 'Kazachstan', 'Liechtenstein', 'Litwa', 'Luksemburg', 'Łotwa', 'Macedonia', 'Malta', 'Mołdawia', 'Monako', 'Niemcy', 'Norwegia', 'Polska', 'Portugalia', 'Rosja', 'Rumunia', 'San Marino', 'Serbia', 'Słowacja', 'Słowenia', 'Szwajcaria', 'Szwecja', 'Turcja', 'Ukraina', 'Watykan', 'Węgry', 'Wielka Brytania', 'Włochy']
  15. self.add_values(european_countries, "Europa")
  16. south_america_countries = ['Argentyna ', 'Boliwia ', 'Brazylia ', 'Chile ', 'Ekwador ', 'Gujana ', 'Kolumbia ', 'Paragwaj ', 'Peru ', 'Surinam ', 'Trynidad i Tobago ', 'Urugwaj ', 'Wenezuela']
  17. self.add_values(south_america_countries, "Południowa Ameryka")
  18. north_america_countries = ['Antigua i Barbuda ', 'Bahamy ', 'Barbados ', 'Belize ', 'Dominika ', 'Dominikana ', 'Grenada ', 'Gwatemala ', 'Haiti ', 'Honduras ', 'Jamajka ', 'Kanada ', 'Kostaryka ', 'Kuba ', 'Meksyk ', 'Nikaragua ', 'Panama ', 'Saint Kitts i Nevis ', 'Saint Lucia ', 'Saint Vincent i Grenadyny ', 'Salwador ', 'Stany Zjednoczone']
  19. self.add_values(north_america_countries, "Północna Ameryka")
  20. poland_woj = ['dolnośląskie ', 'kujawsko-pomorskie ', 'lubelskie ', 'lubuskie ', 'łódzkie ', 'małopolskie ', 'mazowieckie ', 'opolskie ', 'podkarpackie ', 'podlaskie ', 'pomorskie ', 'śląskie ', 'świętokrzyskie ', 'warmińsko-mazurskie ', 'wielkopolskie ', 'zachodniopomorskie']
  21. self.add_items("Polska", ['Województwa']) # metoda klasy, która doda gałęzie do istniejącego już drzewa
  22. self.add_items("Województwa", poland_woj)
  23. self.treeview.bind("<<TreeviewSelect>>", self.on_tv_select) # podpinam zdarzenie, wywoływane, gdy kliknięto jakiś element drzewa
  24. # reszta to nudne i przyziemne podpinanie kontrolki scrollbar oraz pozycjonowanie scrollbara i kontrolki treeview
  25. self.sb_treeview = tk.Scrollbar(self.window)
  26. self.treeview.config(yscrollcommand = self.sb_treeview.set)
  27. self.sb_treeview.config(command = self.treeview.yview)
  28. self.sb_treeview.place(in_ = self.treeview, relx = 1., y = 0, relheight = 1.)
  29. self.treeview.place(x = 0, y = 0, relwidth = 1., relheight = 1., width = -18)
  30. self.window.mainloop()
  31. def add_values(self, values, name): # metoda wstawiająca nowe drzewo z gałęzią
  32. value = self.treeview.insert("", 'end', name, text = name) # dodanie nowego drzewa (korzenia głównego)
  33. for i in values:
  34. self.treeview.insert(value, 'end', i, text = i) # dodawanie kolejnych gałęzi drzewa
  35. def add_items(self, iid, values): # dodawanie podgałęzi do istniejącej gałęzi drzewa
  36. for i in values:
  37. self.treeview.insert(iid, 'end', i, text = i) # dodawanie podgałęzi drzewa
  38. def on_tv_select(self, event): # metoda podpięta pod zdarzenie wywoływane po kliknięciu jakiegoś elementu na liście
  39. curItem = self.treeview.focus() # element, który otrzymał fokus
  40. print(self.treeview.item(curItem)["text"]) # wyświetlanie w konsoli tekstu z klikniętego elementu drzewa
  41. #msb.showinfo("Info", self.treeview.item(curItem)["text"])
  42. apl = Application()

Jak powyższy kod zadziała to powinno pojawić się okienko takie, jak na poniżej załączonym obrazku.

Kontrolka Treeview utworzona w module tkinter z wykorzystaniem Pythona
Rys. 1
Kontrolka Treeview w akcji.

Komentarze