52 votes

Obtenir l'état du bouton de contrôle

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.

66voto

aaronasterling Points 25749

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

4 votes

Pas possible sans variable ? =(

5 votes

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

1 votes

@CiroSantilli2016 C'est bien des années plus tard, mais j'ai répondu à un commentaire que vous aviez fait il y a longtemps.

40voto

bitsmack Points 432

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é" :

alternate

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 :

  1. 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'])
  2. 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".

0voto

Jim Robinson Points 86

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.com

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.

Powered by:

X