ttk.OptionMenu внешняя граница вокруг меню - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь оформить tkinter gui, сначала это gui нелегко изменить. Я достиг стиля, который я хочу для виджетов, которые я использую, за исключением одного взгляда. Я получаю блокировку этой светло-серой границы вокруг меню в виджете ttk.OptionMenu.

Как удалить или раскрасить ее?

Python 3x на Windows 10

Вот только соответствующие части кода.

Некоторые распространенные стили:

self.style = ttk.Style(self)
self.style.theme_use("clam")

self.font12 = tkFont.Font(family="helvetica", size=12)
self.font14 = tkFont.Font(family="helvetica", size=14)

master.option_add("*font", self.font12)
master.option_add("*background", self.bgc)
master.option_add("*foreground", self.fgc)

Стиль для виджета:

master.option_add("*Menu.background", self.dbgc)

self.style.configure("TMenubutton", relief=tk.FLAT, font=self.font14, bd=0, highlightthickness=0,
        arrowcolor="#909090", foreground=self.dfgc, background=self.dbgc)
self.style.map("TMenubutton",
        background=[('disabled', self.dbgc),('pressed', self.abgc), ('active', self.abgc)],
        foreground=[('disabled', "#707070")])

В OptionMenu и есть Menu:

om3 = ttk.OptionMenu(self.top_frame, self.var_quality,
    qualities['u'], *['UltraQuality','High','Normal','Preview'])
om3.pack(side=tk.LEFT, padx=4)
om3['width'] = 10
om3['menu'].configure(relief=tk.FLAT, font=self.font12,
    borderwidth=1, activeborderwidth=5,  activeforeground=self.afgc,
    activebackground=self.abgc, selectcolor=self.fgc)

Результат:

OptionMenu and Menu

Спасибо.

Добавление:

@ stovfl Извините, в моем первом посте я удалил строки, не влияющие на результат, поэтому ваш новый комментарий заставляет меня понять, что не должен. Таким образом, закомментированные строки не имеют никаких эффектов.

И чтобы завершить, как вы можете видеть в оригинальном посте, "lightsickness | borderwidth | activeborderwidth "уже использовался.

И чтобы быть действительно полным, highlightthickness = 0 выглядит так, как будто не имеет эффектов, но это не было прокомментировано в моем первом посте.

self.style.configure("TMenubutton", relief=tk.FLAT, font=self.font14, bd=0, highlightthickness=0,
    # bordercolor=self.dbgc, focusthickness=0, focuscolor=self.dbgc,
    arrowcolor="#909090", foreground=self.dfgc, background=self.dbgc)
self.style.map("TMenubutton",
    background=[('disabled', self.dbgc),('pressed', self.abgc), ('active', self.abgc)],
    foreground=[('disabled', "#707070")],
    # focuscolor=[('disabled', self.dbgc), ('active', self.dbgc)])

# self.style.configure("TMenu", highlightthickness=0, bordercolor=self.dbgc, 
#     focusthickness=0, focuscolor=self.dbgc)
# self.style.map("TMenu",
#     highlightbackground=[('disabled', self.dbgc), ('active', self.dbgc)],
#     highlightcolor=[('disabled', self.dbgc), ('active', self.dbgc)],
#     focuscolor=[('disabled', self.dbgc), ('active', self.dbgc)])

И здесь каждая из закомментированных строк выдает ошибку.

om3 = ttk.OptionMenu(self.top_frame, self.var_quality,
    qualities['u'], *['UltraQuality','High','Normal','Preview'])
om3.pack(side=tk.LEFT, padx=4)
om3['width'] = 10
om3['menu'].configure(relief=tk.FLAT, font=self.font12,
    # focuscolor=self.dbgc,
    # focusthickness=0,
    # bordercolor=self.dbgc,
    # highlightthickness=0,
    borderwidth=1, activeborderwidth=5,  activeforeground=self.afgc,
    activebackground=self.abgc, selectcolor=self.fgc)

Спасибо.

Дополнение:

Эта программа не является личным тестом для обучения, она предназначена для моей работы. Это мои первые попытки использовать tkinter. Кроме того, мне никогда не нужно пытаться сделать gui в python раньше. Программа работает хорошо и делает все, что я должен был реализовать. Дело здесь только в эстетике c и деталях стиля для этой странной границы. Я всегда просматриваю Stackoverflow, это богатый источник информации, поэтому я решил создать учетную запись и опубликовать свой первый вопрос здесь.

Спасибо.

@ stovfl Да, я я тоже надеялся на эти опции, но ширина полосы пропускания и ширина активной границы являются опцией меню и влияют на некоторые внутренние границы меню, а не на внешние.

Чтобы показать эффект ширины границы, я использую значение exagerate при 50 :

enter image description here


@ stovfl Результат печати. ​​

{'activebackground': ('activebackground', 'activeBackground', 'Foreground', <string object: 'SystemHighlight'>, <string object: '#606060'>),
'activeborderwidth': ('activeborderwidth', 'activeBorderWidth', 'BorderWidth', '0', 5),
'activeforeground': ('activeforeground', 'activeForeground', 'Background', <string object: 'SystemHighlightText'>, <string object: '#ffffff'>),
'background': ('background', 'background', 'Background', 'SystemMenu', <string object: '#353535'>),
'bd': ('bd', '-borderwidth'),
'bg': ('bg', '-background'),
'borderwidth': ('borderwidth', 'borderWidth', 'BorderWidth', '0', 1),
'disabledforeground': ('disabledforeground', 'disabledForeground', 'DisabledForeground', <string object: 'SystemDisabledText'>, <string object: '#606060'>),
'fg': ('fg', '-foreground'),
'foreground': ('foreground', 'foreground', 'Foreground', 'SystemMenuText', <string object: '#dddddd'>),
'relief': ('relief', 'relief', 'Relief', 'flat', <string object: 'flat'>),
'selectcolor': ('selectcolor', 'selectColor', 'Background', <string object: 'SystemMenuText'>, <string object: '#dddddd'>),

enter image description here
В моей среде цвет бодера равен black, а с borderwidth=0 границы не отображаются.


...