web-dev-qa-db-fra.com

Obtention de l'état de la case à cocher Tkinter

Comment obtenir l'état d'une case à cocher Tkinter? Par État, je veux dire si oui ou non il a une coche dedans.

35
rectangletangle

Lorsque vous le créez, il prend un argument de mot clé variable. Passez-lui un IntVar de Tkinter. Cochez ou décochez la case pour définir la valeur contenue par var à l'état booléen correspondant. On peut y accéder comme var.get():

vérifié => var.get()

non cochée => 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
39
aaronasterling

Si vous utilisez le nouveau* module ttk de tkinter, vous pouvez lire et écrire les états des boutons de contrôle sans affecter de variables.

import tkinter
from tkinter import ttk
tkwindow = tkinter.Tk()
chk = ttk.Checkbutton(tkwindow, text="foo")
chk.grid(column=0, row=0)

Notez que la nouvelle case à cocher par défaut est "alternative", parfois appelée "semi-cochée":

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 dans le 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é lors de l'ajout d'un indicateur d'état "sélectionné". Donc, si vous voulez basculer votre bouton de contrôle dans le code, vous devez d'abord effacer le drapeau "alternatif":

    chk.state(['!alternate'])
    
  2. Si vous désactivez/activez le bouton de contrôle à l'aide de

    chk.state(['disabled'])
    chk.state(['!disabled'])
    

    alors tout fonctionne bien. Mais, si vous utilisez ces méthodes alternatives courantes:

    chk.config(state=tk.DISABLED)
    chk.config(state=tk.NORMAL)
    

    puis il réaffirme le drapeau "alternatif".

    Ce problème ne se produit pas si vous affectez une variable au bouton de contrôle, mais si vous souhaitez attribuer une variable, cette réponse ne vous aidera probablement pas :)


* ttk est devenu disponible en Python 2.7 (Tk 8.5). Cette question parle des différences entre les anciens widgets standard et les plus récents, "thématiques").

16
bitsmack