如何设置圆的颜色和单选按钮的选择点?

时间:2018-01-29 05:06:02

标签: python tkinter

我正在使用Python tkinter。我可以自定义背景颜色(使用" bg"属性)和字符'通过设置Radiobutton的属性,使用颜色(使用" fg"属性)。现在我需要:

  • 红色背景和
  • 白色字符

所以我创建了一个这样的Radiobutton:

common_bg = '#' + ''.join([hex(x)[2:].zfill(2) for x in (181, 26, 18)])  # RGB in dec
common_fg = '#ffffff'  # pure white
Radiobutton(paraent_frame, text='abc', variable=radio_value, value=2,
            command=on_click_level_radio, bg=common_bg, fg=common_fg)

GUI看起来像这样(黑色箭头由我自己添加):

enter image description here

但问题是,单选按钮的圆圈背景为白色。当小点'用于指示是否选择了收音机,默认为黑色,效果很好。当我设置" fg"财产到白色,小点'也变得白了,因此无法区分是否选择了收音机。

所以我想知道是否有办法分别设置'圈的颜色。单选按钮或小点'。

2 个答案:

答案 0 :(得分:3)

一种方法是在单选按钮旁边放置一个标签:

l = Label(root, text="abc", fg="white")
l.pack()

在这种情况下,您还需要将单选按钮的文本更改为“”。这会解决问题吗?

答案 1 :(得分:3)

当然,这是可能的。

实际上,"小点"是指标,"圈"是指标背景

在您的情况下,指标从foreground / activeforeground选项继承其颜色(这些是纯白色),默认情况下指标背景为纯白色。

要解决此问题,您应该设置radiobutton的颜色属性(您应该注意selectcolor选项!):

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

root = tk.Tk()

common_bg = '#' + ''.join([hex(x)[2:].zfill(2) for x in (181, 26, 18)])  # RGB in dec
common_fg = '#ffffff'  # pure white

rad_button = tk.Radiobutton(root, text='abc', value=2, fg=common_fg, bg=common_bg,
                            activebackground=common_bg, activeforeground=common_fg, selectcolor=common_bg)

rad_button.pack(expand=True, fill='both')
root.mainloop()

结果是:

result

但是,文档声称此选项具有依赖于系统的行为:

  

指定选择按钮时使用的背景颜色。如果-indicatoron为true,则颜色适用于指标。在Windows下,无论选择状态如何,此颜色都将用作指示符的背景。如果-indicatoron为false,则无论何时选择窗口小部件,此颜色都将用作整个窗口小部件的背景,而不是-background或-activeBackground。如果指定为空字符串,则在选择窗口小部件时不会使用特殊颜色进行显示。

因此,请考虑使用ttk radiobuttontry: import tkinter as tk import tkinter.ttk as ttk except ImportError: import Tkinter as tk import ttk root = tk.Tk() style = ttk.Style(root) # try also the 'clam' theme style.theme_use('alt') common_bg = '#' + ''.join([hex(x)[2:].zfill(2) for x in (181, 26, 18)]) # RGB in dec # alternatively use the "more red" version of the common_bg as the indicatorcolor # sel_bg = '#' + ''.join([hex(x)[2:].zfill(2) for x in (221, 26, 18)]) common_fg = '#ffffff' # pure white rad_button = ttk.Radiobutton(root, text='abc') rad_button.pack(expand=True, fill='both') style_name = rad_button.winfo_class() style.configure(style_name, foreground=common_fg, background=common_bg, indicatorcolor=common_bg) style.map(style_name, foreground = [('disabled', common_fg), ('pressed', common_fg), ('active', common_fg)], background = [('disabled', common_bg), ('pressed', '!focus', common_bg), ('active', common_bg)], indicatorcolor=[('selected', common_bg), ('pressed', common_bg)] ) root.mainloop() themeoptions

bg

结果是:

result

从理论上讲,您可以为fglabel指定单独的indicator / radiobutton颜色集,但问题源于{{1}的实施小部件。

如果你print(style.layout(style_name)),你会看到这种结构:

[('Radiobutton.padding',
  {'children': [('Radiobutton.indicator', {'side': 'left', 'sticky': ''}),
                ('Radiobutton.focus',
                 {'children': [('Radiobutton.label', {'sticky': 'nswe'})],
                  'side': 'left',
                  'sticky': ''})],
   'sticky': 'nswe'})]

稍后,通过print(style.element_options(element)查找每个元素选项:

# result of print(style.element_options('Radiobutton.indicator'))
('-background', '-foreground', '-indicatorcolor', '-lightcolor', '-shadecolor', '-bordercolor', '-indicatormargin')

# result of print(style.element_options('Radiobutton.label'))
('-compound', '-space', '-text', '-font', '-foreground', '-underline', '-width', '-anchor', '-justify', '-wraplength', '-embossed', '-image', '-stipple', '-background')

请注意,这两个元素都有'-background' / '-foreground'个选项,因此当为整个样式设置该选项时,它们都会以相同的方式做出反应。换句话说,labelindicator按设计分享其颜色