Возможно ли создать выпадающее меню в tkinter / ttk с группировкой опций в стиле HTML optgroup? - PullRequest
0 голосов
/ 16 мая 2018

Я хочу создать выпадающее меню, используя tkinter из словаря массивов, где я хочу, чтобы ключи представляли группы более высокого уровня для выбора меню, а строки внутри массивов значений представляли фактические варианты выбора, доступные пользователю.Другими словами, при щелчке по раскрывающемуся списку раскрывающийся список должен напоминать созданный в HTML с помощью тега optgroup, где присутствуют как невыбираемые метки, действующие как заголовки групп, так и выбираемые метки, действующие как фактические варианты выбора.

Мой словарьвыглядит примерно так:

ingredients = {
    "Herbs":
        ["basil",
        "oregano",
        "thyme"],
     "Meats":
        ["chicken",
          "beef",
          "venison",],
     "Spices":
        ["pepper",
          "salt",
          "chilli powder",
          "cumin"]
    }

Пользователь должен иметь возможность выбирать «базилик», «говядину», «соль» и т. д. из выпадающего меню, но не «травы», «мясо» или «специи».', которые должны присутствовать только в виде статических названий для разных групп ингредиентов.Возможно ли это, используя только tkinter / ttk?

1 Ответ

0 голосов
/ 16 мая 2018

Может быть, это поможет вам по крайней мере

from tkinter import *

root = Tk()
root.title("Tk dropdown example")

mainframe = Frame(root)

mainframe.grid()

tkvar = StringVar(root)

ingredients = {
    "Herbs":
        ["basil",
        "oregano",
        "thyme"],
     "Meats":
        ["chicken",
          "beef",
          "venison",],
     "Spices":
        ["pepper",
          "salt",
          "chilli powder",
          "cumin"]
    }
c=[]
for k,v in ingredients.items():
    c.append(k)
    c.extend(v)
ddl = OptionMenu(mainframe, tkvar, *c)
Label(mainframe, text="Choose a dish").grid(row = 1, column = 1)
ddl.grid(row = 2, column =1)
for i in ingredients:
        ddl['menu'].entryconfigure(i, state = "disabled",font=('arial italic',11))

root.mainloop()
...