如何在ttk.OptionMenu周围设置边框

时间:2018-07-26 08:57:39

标签: python tkinter ttk

在尝试制作输入框时,我遇到了一个问题,即我无法在ttk.OptionMenu周围加边框,以使其看起来与ttk.Entry类似。 (彼此相邻的两个在图像中)

制作OptionMenu

option = ttk.OptionMenu(bottom_container, self.have, 'ANY', 'ANY', '0', '1', style='vista.TMenubutton')
option.grid(column=1, row=2, sticky='we')

我尝试使用样式(希望仍然使用vista / winnative外观),并且能够将optionmenu背景设置为白色,但是找不到适合其边框的方法

OptionMenu next to Entry

1 个答案:

答案 0 :(得分:2)

这是我用于检查ttk小部件的代码,以期确定如何为其主题化:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
var = tk.StringVar()
widget = ttk.OptionMenu(root, var, 'ANY', 'ANY', '0', '1')
widget.grid(column=2, row=1, sticky='nesw')


style = widget.winfo_class()

s = ttk.Style()
#s.theme_use('clam')
elements = s.layout(style)

def get_element_details(elem, _dict, depth=1):
    print('%selement: %s' % (''.join(['\t' for s in range(depth)]), elem))
    for key in _dict:
        if key != 'children':
            print('%s%s: %s' % (''.join(['\t' for s in range(depth+1)]), key, _dict[key]))
    print('%soption: %s' % (''.join(['\t' for s in range(depth+1)]), s.element_options(elem)))
    if 'children' in _dict:
        for child, child_dict in _dict['children']:
            get_element_details(child, child_dict, depth+1)

print('element: %s' % style)
print('option: %s' % str(s.element_options(style)))
for elem, elem_dict in elements:
    get_element_details(elem, elem_dict)
root.mainloop()

简单地说,无需将主题切换为蛤主题,就无需在窗口小部件中添加边框(我知道这很愚蠢)

我没有可测试的Vista主题,但是有了XP主题,我得到了:

element: TMenubutton
option: ()
    element: Menubutton.dropdown
        side: right
        sticky: ns
        option: ()
    element: Menubutton.button
        expand: 1
        sticky: nswe
        option: ()
        element: Menubutton.padding
            expand: 1
            sticky: we
            option: ('-padding', '-relief', '-shiftrelief')
            element: Menubutton.label
                sticky: 
                option: ('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

并带有蛤lam主题:

element: TMenubutton
option: ()
    element: Menubutton.border
        sticky: nswe
        option: ('-bordercolor', '-lightcolor', '-darkcolor', '-relief', '-borderwidth')
        element: Menubutton.focus
            sticky: nswe
            option: ('-focuscolor', '-focusthickness')
            element: Menubutton.indicator
                sticky: 
                side: right
                option: ('-arrowsize', '-arrowcolor', '-arrowpadding')
            element: Menubutton.padding
                expand: 1
                sticky: we
                option: ('-padding', '-relief', '-shiftrelief')
                element: Menubutton.label
                    sticky: 
                    side: left
                    option: ('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

是否注意到边框元素的添加?

,如果您尝试使用以下方法将蛤主题选项菜单的布局复制到另一个主题:

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

结果是:

element: TMenubutton
option: ()
    element: Menubutton.border
        sticky: nswe
        option: ('-relief',)
        element: Menubutton.focus
            sticky: nswe
            option: ()
            element: Menubutton.indicator
                sticky: 
                side: right
                option: ('-direction', '-arrowsize', '-arrowcolor')
            element: Menubutton.padding
                sticky: we
                expand: 1
                option: ('-padding', '-relief', '-shiftrelief')
                element: Menubutton.label
                    sticky: 
                    side: left
                    option: ('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

,它不再具有用于实际设置边框的选项。本质上,主题引擎无法正确处理具有其期望的不同元素的布局。因此您需要选择一个主题,该主题的小部件包含您要设置样式的所有元素。