Tkinter: Radiobutton colore di sfondo quando selezionato

Aug 19 2020

Ho Radiobuttonvisualizzato l'aspetto del pulsante incavato che vorrei avere:

  • testo nero su sfondo bianco quando non selezionato,
  • testo bianco su sfondo grigio scuro quando selezionato.

Al momento ho solo lo sfondo grigio ma nessun testo bianco quando selezionato, il che crea uno scarso contrasto.

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.Radiobuttonha un'opzione da configurare selectcolor, che è il colore di sfondo quando selezionato, ma sembra non offrire tale opzione per il colore di primo piano quando selezionato.

Ho pensato che si potrebbe ottenere questo specificando un commandattivato sulla selezione che rb.configla foregroundsu quel radiobutton che viene selezionato, ma ciò richiederebbe l'accesso dall'esterno le proprietà di pulsanti stessi, piuttosto che il valore della variabile stabilita, che ho trovato nessun modo per farlo finora.

Come ottengo un'opzione sulla falsariga di selectforeground?

Risposte

1 Atlas435 Aug 19 2020 at 16:08

Usa una funzione anonima per questo:

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()