Tkinter: botón de radio para el color de fondo cuando se selecciona

Aug 19 2020

He Radiobuttonmostrado un aspecto de botón hundido que me gustaría tener:

  • texto negro sobre fondo blanco cuando no está seleccionado,
  • texto blanco sobre fondo gris oscuro cuando se selecciona.

Actualmente solo tengo un fondo gris pero no tengo texto en blanco cuando se selecciona, lo que genera un contraste deficiente.

for (lbl, val) in [("A", "a"), ("B", "b"))]:
    rb = tk.Radiobutton(tab,
                        text=lbl,
                        variable=v,
                        value=val,
                        command=select,
                        selectcolor=gray,
                        indicatoron=0,
                        width=25, pady=7.5)
    rb.pack(...)

tk.Radiobuttontiene una opción para configurar selectcolor, que es el color de fondo cuando se selecciona, pero parece no ofrecer tal opción para el color de primer plano cuando se selecciona.

Pensé que uno podría lograr esto especificando una commandselección activada que se activará en rb.configel foregroundbotón de radio que está seleccionado, pero esto requeriría acceder externamente a las propiedades de los botones de radio en sí, en lugar de solo el valor de la variable que establecieron, que encontré no hay forma de hacerlo hasta ahora.

¿Cómo consigo una opción en la línea de selectforeground?

Respuestas

1 Atlas435 Aug 19 2020 at 16:08

Utilice una función anónima para esto:

import tkinter as tk

def select(rb):
    rb.config(foreground='white')
    for rb_ in rbs:
        if rb_ != rb:
           rb_.config(fg='black')

root = tk.Tk()

rbs=[]

def do_buttons():
    for _ in range(11):
        v=tk.IntVar()
        val = 1

        rb = tk.Radiobutton(root,
                            text="A",
                            variable=v,
                            value=val,
                            selectcolor='gray',
                            indicatoron=0,
                            width=25, pady=7.5)
        rb.config(command=lambda arg=rb:select(arg))

        rb.pack()
        rbs.append(rb)

b = tk.Button(root, text='click', command=do_buttons)
b.pack()

root.mainloop()