Шаг 57.
Библиотека Tkinter. Компоненты и вспомогательные классы. Нестилизуемые компоненты. Реализация прокрутки в компоненте Listbox

    На этом шаге мы рассмотрим создание полос прокрутки в этом компоненте.

    Как и уже знакомый нам компонент 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.




Предыдущий шаг Содержание Следующий шаг