Tkinter как правильно стилизовать полосу прокрутки combobox - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь создать полосу прокрутки виджета со списком. Я хочу установить цвет и размер желоба. Мне удалось установить размер, изменив параметр arrowize, как в приведенном ниже коде. Это нежелательно, потому что это изменяет все вертикальные полосы прокрутки для всех виджетов. Я хотел бы настроить таргетинг на определенные c виджеты.

import tkinter as tk
import tkinter.ttk as ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title('Default Demo')
        self.geometry('420x200')

        style = ttk.Style()
        style.configure('my.TCombobox', arrowsize=30)
        style.configure('Vertical.TScrollbar', arrowsize=28)
        # style.configure('my.TCombobox.Vertical.TScrollbar', arrowsize=28)

        values = []
        for idx in range(1, 50):
            values.append(f'Testing-{idx}')

        cbo = ttk.Combobox(self, values=values, style='my.TCombobox')
        cbo.grid(ipady=5)


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 28 июля 2020

Полоса прокрутки combobox недоступна напрямую через интерфейс python, но вы можете изменить ее стиль с помощью интерпретатора tcl.

Сначала дайте имя раскрывающемуся списку combobox:

self.tk.eval('set popdown [ttk::combobox::PopdownWindow %s]' % cbo)

Затем измените стиль полосы прокрутки:

self.tk.eval(f'$popdown.f.sb configure -style my.TCombobox.Vertical.TScrollbar')

Полный пример:

import tkinter as tk
import tkinter.ttk as ttk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title('Default Demo')
        self.geometry('420x200')

        style = ttk.Style()
        style.configure('my.TCombobox', arrowsize=30)
        style.configure('my.TCombobox.Vertical.TScrollbar', arrowsize=28)

        values = []
        for idx in range(1, 50):
            values.append(f'Testing-{idx}')

        cbo = ttk.Combobox(self, values=values, style='my.TCombobox')
        cbo.grid(ipady=5)

        self.tk.eval('set popdown [ttk::combobox::PopdownWindow %s]' % cbo)
        self.tk.eval(f'$popdown.f.sb configure -style my.TCombobox.Vertical.TScrollbar')

        ttk.Scrollbar(self, orient='vertical').grid(row=0, column=1, sticky='ns')

if __name__ == '__main__':
    app = App()
    app.mainloop()
...