Comment puis-je obtenir le 'state'
d'un Tkinter Checkbutton
? Par 'state'
Je veux dire obtenir si oui ou non il y a une marque de contrôle dedans ou pas.
Pas possible sans variable ? =(
Comment puis-je obtenir le 'state'
d'un Tkinter Checkbutton
? Par 'state'
Je veux dire obtenir si oui ou non il y a une marque de contrôle dedans ou pas.
Quand vous le créez, il faut un variable
argument de mot-clé. Passez-lui un IntVar
de Tkinter
. Le fait de cocher ou de décocher la case définira la valeur contenue par var
à l'état booléen correspondant. On peut y accéder comme suit var.get()
:
coché => var.get()
non vérifié => not var.get()
>>> root = Tkinter.Tk()
>>> var = Tkinter.IntVar()
>>> chk = Tkinter.Checkbutton(root, text='foo', variable=var)
>>> chk.pack(side=Tkinter.LEFT)
>>> var.get() #unchecked
0
>>> var.get() #checked
1
S'il est important pour vous de pouvoir obtenir la valeur via le widget, vous pouvez toujours attacher la variable au widget (quelque chose comme chk.val = var) et y accéder ensuite avec chk.val.get().
@CiroSantilli2016 C'est bien des années plus tard, mais j'ai répondu à un commentaire que vous aviez fait il y a longtemps.
Si vous utilisez le nouveau * ttk de tkinter, vous pouvez lire et écrire les états des boutons de contrôle sans assigner de variables.
import tkinter
from tkinter import ttk
tkwindow = tkinter.Tk()
chk = ttk.Checkbutton(tkwindow, text="foo")
chk.grid(column=0, row=0)
Remarquez que la nouvelle case à cocher prend par défaut l'état "alternatif", parfois appelé "à moitié coché" :
Vous pouvez lire l'état actuel en utilisant la méthode .state() :
>>> print(chk.state()) # half-checked
('alternate',)
>>> print(chk.state()) # checked
('selected',)
>>> print(chk.state()) # not checked
()
Pour définir l'état en code :
chk.state(['selected']) # check the checkbox
chk.state(['!selected']) # clear the checkbox
chk.state(['disabled']) # disable the checkbox
chk.state(['!disabled','selected']) # enable the checkbox and put a check in it!
Et voici un moyen pratique de vérifier un état spécifique :
chk.instate(['selected']) # returns True if the box is checked
Il y a deux choses délicates que j'ai trouvées :
L'état initial est "alternatif", et cet indicateur d'état n'est pas effacé lorsqu'on ajoute un indicateur d'état "sélectionné". Donc, si vous voulez faire basculer votre bouton de contrôle dans le code, vous devrez d'abord effacer l'indicateur "alternate" :
chk.state(['!alternate'])
Si vous désactivez/activez le bouton de contrôle à l'aide de la fonction
chk.state(['disabled'])
chk.state(['!disabled'])
alors tout fonctionne bien. Mais, si vous utilisez ces méthodes courantes et alternatives :
chk.config(state=tk.DISABLED)
chk.config(state=tk.NORMAL)
puis il réaffirme le drapeau "alternatif".
Ce comportement ne se produit pas si vous attribuez une variable au bouton de contrôle, mais si vous voulez attribuer une variable, cette réponse ne vous aidera probablement pas :)
* ttk est devenu disponible dans Python 2.7 (Tk 8.5). Ce site question traite des différences entre les anciens widgets standard et les nouveaux widgets "à thème".
La réponse de bitsmack ne correspond pas exactement à ce que je vois.
chk.state() retourne un tuple qui a deux éléments lorsqu'il est sélectionné : ('focus', 'selected')
import tkinter as tk
from tkinter import ttk
def p(event):
st = ck.state()
print (f'is tuple {type(st) is tuple} {len(st)}-----------------------------------------')
if 'selected' in st:
print ('got selected')
for i,pst in enumerate(st) :
print(f'{i}, {pst}')
root = tk.Tk()
root.geometry('200x200+300+200')
root.grid_rowconfigure(0, weight = 1)
ck = ttk.Checkbutton(root,text = 'tryme')
ck.grid()
root.bind('<Return>',p)
root.mainloop()
donne ce résultat :
est un tuple Vrai 1----------------------------------------
0, alternatif est un tuple Vrai 2-----------------------------------------
a été sélectionné 0, focus 1, sélectionné est un tuple True 1-----------------------------------------
0, focus
Donc, pour déterminer si la case à cocher est sélectionnée :
if 'selected' in chk.state()
pour l'alternance :
if 'alternate' in chk.state()
pour non sélectionné :
if not ('selected' in chk.state or 'alternate' in chk.state)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.