На этом шаге мы рассмотрим создание полос прокрутки в этом компоненте.
Как и уже знакомый нам компонент Treeview, Listbox в случае необходимости не выводит полосы прокрутки самостоятельно. Нам самим придется создать их и привязать к списку.
Для связывания списка с полосами прокрутки компонент Listbox поддерживает такие опции:
Также компонент Listbox поддерживает методы xview() и yview(), присваиваемые опции command соответствующих компонентов Scrollbar.
Вот пример реализации прокрутки в компоненте Listbox по горизонтали и вертикали (хотя обычно требуется обеспечить в нем только вертикальную прокрутку):
import tkinter import tkinter.ttk class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) # Обязательно указываем ширину и высоту контейнера посредством # опций width и height соответственно self.configure(width=200, height=100) self.pack(padx=4, pady=4) self.create_widgets() self.master.title("Пример использования ListBox") def create_widgets(self): s = tkinter.ttk.Style() s.theme_use('classic') lstPlatforms = tkinter.Listbox(self, cursor="mouse", exportselection=0, activestyle="dotbox") lstPlatforms.insert(tkinter.END, "Python") lstPlatforms.insert(tkinter.END, "PHP") lstPlatforms.insert(tkinter.END, "Ruby") lstPlatforms.insert(tkinter.END, ".NET") lstPlatforms.grid(row=0, column=0, sticky="wnes") hs = tkinter.ttk.Scrollbar(self, orient=tkinter.HORIZONTAL, command=lstPlatforms.xview) lstPlatforms["xscrollcommand"] = hs.set hs.grid(row=1, column=0, sticky="we") vs = tkinter.ttk.Scrollbar(self, command=lstPlatforms.yview) lstPlatforms["yscrollcommand"] = vs.set vs.grid(row=0, column=1, sticky="ns") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) root = tkinter.Tk() app = Application(master=root) root.mainloop()
Рис.1. Компонент Listbox полосами прокрутки
Нужно отметить, что в случае, если прокрутка в каком-либо направлении не требуется (т. е. все содержимое списка полностью помещается в нем), соответствующая полоса прокрутки станет недоступной. К сожалению, иерархический список Treeview не обладает такой функциональностью.
На следующем шаге мы рассмотрим виджет Spinbox.