为什么ttk.Menubutton中的指示器没有消失?

Why does the indicator in ttk.Menubutton not disappear?

我用 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

tk.Menubutton

如何解决?

指示器不会消失,因为 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') 以将此布局用于此特定菜单按钮。