ttk.Radiobutton circle/diamond 怎么改?

How do you change ttk.Radiobutton circle/diamond?

我不得不使用 ttk.Radiobutton 而不是 Radiobutton,因为我想将文本移动到圆圈上方,但从那以后圆圈变成了菱形。 (见下图)

我试过关闭指示灯 cTheme = ttk.Style() cTheme.configure("TRadiobutton", indicatoron=False) 但这似乎什么都不做。

我想将新的单选按钮形状从菱形改回圆形.. 或者当单击按钮时它会改变形状或颜色,因为目前没有任何变化向用户显示它已被单击。有人有什么想法吗?

单选按钮的 ttk 版本不支持 indicatoron 选项。但是,您可以将 ttk 主题更改为带有圆圈的单选按钮(例如 'clam' 或 'alt'):

cTheme.theme_use('clam')

请注意,在配置“TRadiobutton”样式之前需要更改主题。

此外,要摆脱按钮中最初的蓝色,请更改其状态(默认状态为 'alternate')以获得正常的未选中单选按钮:

radiobutton.state(["!alternate"])

编辑:如果保留默认主题,可以使按钮的选择更加明显,例如将所选颜色更改为亮绿色:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
var = tk.IntVar(root, 1)
style = ttk.Style(root)
style.map('TRadiobutton', indicatorcolor=[('selected', '#00FF00')])
r1 = ttk.Radiobutton(root, value=1, variable=var, text='1')
r2 = ttk.Radiobutton(root, value=2, variable=var, text='2')
r1.pack()
r2.pack()

另一种方法是根据图片创建您自己的指标并覆盖 'TRadiobutton' 布局中的 'Radiobutton.indicator':

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
  
var = tk.IntVar(root, 1)

style = ttk.Style(root)

data_unselected = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\tpHYs\x00\x00\x10\x9b\x00\x00\x10\x9b\x01t\x89\x9cK\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\x01_IDAT8\x8d\xa5SMk\xc2@\x10}[*\x8b\x0c\xac\xa5\x7f@<Yu\x93\xfaGzV\xfbqM\xfeOXr\xc8/\xb0\xbd\xfaKb\x03\xad7k\xcf\xa5`\x0cB,;\xbdD\xb1i\xacB\x1f\xcce\x98\xf7\xf6\xcdc\x16\xf8\'DE\xaf\x06`\xa8\x94\x1a\x08!\xae\x00\x80\x99_\x97\xcb\xe5\x18\xc0#\x80\xcd_\x02}"\x9a\xb4Z\xad\x0b\xcf\xf3\xea\x8e\xe30\x00L\xa7S\x11E\xd1z>\x9f\x7ffYv\x03 \xaer\xd3\x97R\xae\xc20\xdcXksf\xfeQ\xd6\xda\xdc\x18\x93K)3\x00\xee/\xdbD\xf4\x1e\x86\xe1\xa6L,\x971&\'\xa2\xb7b\xd5\x1d\x1e\xb4\xd6i\xd5\xcbUN\xba\xddn\n\xe0\x0e\x00\xce\x00\xa0\xd1h\x8c|\xdf\xaf\x0bQ\x95i)u!\xe0\xfb~])5\xda\t\x00hk\xad\xf9(\xbb\x80\xd6\x9a\x85\x10\xed}\x01f>\x99\x8fb\x96w\x02\xcc<K\x92\xe4\xb8\xff\x02I\x92\x08f\x9e\xed\xf7\xee{\xbd\xde\xc9!v:\x9d\x14\xc0\xed\xbe@\x8d\x88\x16\xc6\x98\xa3\x02A\x10\xe4D4\x07p^vv-\xa5\xcc\x8c1\xf9\xa1C\n\x82 \x97R\xae\x008[Ryo\x97\x88&\xcdf\xf3\xd2\xf3\xbc\xba\xeb\xba\x0c\x00q\x1c\x8b(\x8a\xd6\x8b\xc5\xe2\xa38\xe5\xe7C\x02(\xac\r\x94R\xc3\xedg\xb2\xd6\xbe\xa4i:\x06\xf0\x04\xe0\xeb\xd4\xb0O\xc27yq5\xbb\x9e?8\xa4\x00\x00\x00\x00IEND\xaeB`\x82'
img_unselected = tk.PhotoImage("radiobutton_unselected", master=root, data=data_unselected)
data_selected = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\tpHYs\x00\x00\x10\x9b\x00\x00\x10\x9b\x01t\x89\x9cK\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\x01\xcdIDAT8\x8d\xa5S\xc1n\xda@\x10}k5ZE+\xd9\xab\xfe\x00\xe2\x94\x02\x86\xe6\x0f\xe0\x07zN\xd4\xa6W\xff\x0ff\xe5\x83\xbf \xb5\x0f\xc8\xa4\xea\xd9\xbf\x00\xb5\xd4\xe6F\xe9\t\xa3\xaa\x80\x83"\x19k\xa7\x07\xb0E\x02\xe9\xa1\x1di/\xb3\xfb\xde\xbcy3\x0b\xfcg\xb0\x13\xb93\x00\xd7\xa6i^1\xc6\xde\x00\x00\x11}_\xaf\xd7\xb7\x00>\x01\xd8\xfe\x8d\xe0R\x08qW\xaf\xd7\xa5\xe38\xe7\xedv\x9b\x00`2\x990\xdf\xf7\x1f\xa7\xd3\xe9\xef\xcdf\xf3\x0e\xc0\xf8\x94\x9aK\xce\xf9\x83\xe7y[\xaduNDO\x8e\xd6:WJ\xe5\x9c\xf3\r\x80\xce\x91l!\xc4O\xcf\xf3\xb6%`>\x9f\xe7A\x10\x14A\x10\x14i\x9aVDJ\xa9\\x08\xf1c\xdfj\x15\x1fm\xdb\xce\xca\xca\xc3\xe1\xb0\xb0,\x8b\x00\x10\x00\x92RR\x14EE\xa9\xa4\xd9lf\x00>Th\xcb\xb2\xbe\x0c\x06\x83\xa2\xac|\x08>$)\x95\xf4\xfb\xfd\xc24\xcd\xcf\x00`\xec9.l\xdb&\x00\x88\xe3\xd8X\xadVG\x06-\x97K\xc4ql\x00\x80m\xdb\xc4\x18\xbb8$ "\xda\x8d\x85\x9d\x9a\xec.\x0c\xc3(\x1fc\xaflG@D\xf7I\x920\x00\xe8\xf5zZJy\x04\x96R\xa2\xdb\xedj\x00H\x92\x84\x11\xd1\xfd\xe1\xfdM\xab\xd5\xaaL\x8c\xa2\xa8\x90R>\xe9\x7f4\x1amK\x13\x1b\x8dF\x06\xe0\xfd!\xc1\x99\x10b\xa6\x94\xaa\xc6\x95\xa6i\x1e\x86a\x11\x86a\xb1X,\xaa\xbc\xeb\xba\xb9\x10b\n\xe0\xd5s\x95o9\xe7\x1b\xa5T\xfe\xd2"\xb9\xae\x9bs\xce\x1f\x00\xb4K\xd0s\xc7:B\x88\xbbZ\xad\xf6\xdaq\x9c\xf3N\xa7C\x000\x1e\x8f\x99\xef\xfb\x8f\xb3\xd9\xec\xd7~\x95\xbf\xbeD\x80\xbd\xb4+\xd34\xaf\xcb\xcf\xa4\xb5\xfe\x96e\xd9-\x80\x00@q\x02\xf3\xef\xf1\x07\x84\xe6=}U\x13]\xb7\x00\x00\x00\x00IEND\xaeB`\x82'
img_selected = tk.PhotoImage("radiobutton_selected", master=root, data=data_selected)

style.element_create('custom.indicator', 'image', "radiobutton_unselected",
                     ('selected', '!disabled', "radiobutton_selected"))
style.layout(
    'TRadiobutton',
    [('Radiobutton.padding',
      {'sticky': 'nswe',
       'children': [('custom.indicator', {'side': 'left', 'sticky': ''}),
                    ('Radiobutton.focus',
                     {'side': 'left',
                      'sticky': '',
                      'children': [('Radiobutton.label', {'sticky': 'nswe'})]})]})])

r1 = ttk.Radiobutton(root, value=1, variable=var, text='1')
r2 = ttk.Radiobutton(root, value=2, variable=var, text='2')
r1.pack()
r2.pack()

请注意,如果您希望具有明显的“禁用”状态,则在定义主题元素时需要额外的图像。