Почему индикатор в ttk.Menubutton не исчезает? - PullRequest
1 голос
/ 21 апреля 2020

Я написал код с ttk.Menubutton, но столкнулся с проблемой - индикатор не исчезает, хотя можно было удалить его в tk.Menubutton.

Код

ttk.Menubutton:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

root.option_add("*Menu.borderWidth", "0")
root.option_add("*Menu.activeBorderWidth", "0")
root.option_add("*Menu.background", "black")


style = ttk.Style(root)


menu = tk.Menu(root)

btn_menu = ttk.Menubutton(root, text='fegvd')
btn_menu.pack()

file = tk.Menu(btn_menu, tearoff=0, foreground='white')
file.add_command(label='ГЫГ')

style.configure('TMenubutton', background='black', foreground='white', indicatoron=0, menu=file, direction='delow', state='active')

root.mainloop()

tk.Menubutton:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

root.option_add("*Menu.borderWidth", "0")
root.option_add("*Menu.activeBorderWidth", "0")
root.option_add("*Menu.background", "black")


menu = tk.Menu(root)

btn_menu = tk.Menubutton(root, text='fegvd')
btn_menu.pack()


file = tk.Menu(btn_menu, tearoff=0, foreground='white')
file.add_command(label='ГЫГ')

btn_menu.configure(background='black', foreground='white', indicator=0, menu=file, state='active')

root.mainloop()

Скриншоты

ttk.Menubutton

enter image description here

tk.Menubutton

enter image description here

Как это исправить?

1 Ответ

0 голосов
/ 21 апреля 2020

Индикатор не исчезает, потому что в теме ttk нет опции indicatoron, а style.configure() просто игнорирует недопустимые параметры вместо сообщения об ошибке.

Однако вы, вероятно, можете избавиться от индикатора используя style.layout(). Приведенное ниже решение не работает с темой по умолчанию в OSX, но работает для «clam» и «alt». Кажется, вы используете Windows, поэтому, возможно, он также будет работать для темы Windows, в противном случае вы можете изменить тему.

Если вы посмотрите на вывод style.layout('TMenubutton'), у вас будет что-то вроде

[('Menubutton.border',
  {'sticky': 'nswe',
   'children': [('Menubutton.focus',
     {'sticky': 'nswe',
      'children': [('Menubutton.indicator', {'side': 'right', 'sticky': ''}),
       ('Menubutton.padding',
        {'expand': '1',
         'sticky': 'we',
         'children': [('Menubutton.label',
           {'side': 'left', 'sticky': ''})]})]})]})]

Чтобы избавиться от 'Menubutton.indicator', вы можете просто удалить его из макета:

style.layout('TMenubutton', [('Menubutton.border',
  {'sticky': 'nswe',
   'children': [('Menubutton.focus',
     {'sticky': 'nswe',
      'children': [
       ('Menubutton.padding',
        {'expand': '1',
         'sticky': 'we',
         'children': [('Menubutton.label',
           {'side': 'left', 'sticky': ''})]})]})]})])

Если вам нужны другие кнопки меню с индикатором, вы можете заменить ' TMenubutton 'с произвольным именем, например, noindicator.TMenubutton, и выполните btn_menu.configure(style='noindicator.TMenubutton'), чтобы использовать этот макет для этого конкретного меню.

...