IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Cocher une case en décoche une autre


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Cocher une case en décoche une autre
    Bonjour à tous.
    Je suis venue demander de l'aide <a class="inlineAdmedialink" href="#">car</a> je n'arrive pas à régler mon problème de checkbutton. J'essaye de faire en sorte que si une checkbutton est cochée cela décoche çà voisine. Je veux créer autant de paire de checkbuttons qu'il y a de faisceaux (comptés auparavant). Pour chaques faisceaux je voulais que si je coche une case çà décoche l'autre et inversement mais que c
    çà ne perturbe pas les cases des checkbuttons des autres faisceaux...Je travaille avec python v3.2.3 et tkinter pour l'interface graphique. voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
            ## n° diode ref
            label=tkinter.Label(self,text="n° diode ref",anchor="w") #création d'un label
            label.grid(column=0,row=16,pady=3) #emplacement du label
            self.var1=tkinter.IntVar()
            self.var2=tkinter.IntVar()
     
            for i in range(0,compteur_faisceaux): # pour créer deux cases à cocher par faisceau
                if dico['Energy'+ str(i+1)]=='6': # si l'énergie était de 6 MV
                    def fonction(var1,var2):
                        if self.var1.get() ==1:  #recuperation de la valeur du checkbutton
                            self.var2(0)
                            self.checkbutton1=tkinter.Checkbutton(self,text="1",variable=self.var1,onvalue=1,offvalue=0) #création d'une case à cocher pour 1
                            self.checkbutton1.grid(column=1+i,row=16,sticky='W') #emplacement de la case à cocher
                            self.checkbutton2=tkinter.Checkbutton(self,text="11",variable=self.var2,onvalue=1,offvalue=0) #création d'une case à cocher pour 11
                            self.checkbutton2.grid(column=1+i,row=16,sticky='E') #emplacement de la case à cocher
                        else:
                            self.var2(1)
                            self.checkbutton1=tkinter.Checkbutton(self,text="1",variable=self.var1,onvalue=1,offvalue=0) #création d'une case à cocher pour 1
                            self.checkbutton1.grid(column=1+i,row=16,sticky='W') #emplacement de la case à cocher
                            self.checkbutton2=tkinter.Checkbutton(self,text="11",variable=self.var2,onvalue=1,offvalue=0) #création d'une case à cocher pour 11
                            self.checkbutton2.grid(column=1+i,row=16,sticky='E') #emplacement de la case à cocher
                    #création des checkbutton au début sans clic
                    self.checkbutton1=tkinter.Checkbutton(self,text="1",variable=self.var1,onvalue=1,offvalue=0) #création d'une case à cocher pour 1
                    self.checkbutton1.grid(column=1+i,row=16,sticky='W') #emplacement de la case à cocher
                    self.checkbutton1.bind('<ButtonRelease-1>',fonction(var1,var2))
                    self.checkbutton2=tkinter.Checkbutton(self,text="11",variable=self.var2,onvalue=1,offvalue=0) #création d'une case à cocher pour 11
                    self.checkbutton2.grid(column=1+i,row=16,sticky='E') #emplacement de la case à cocher
                    self.checkbutton2.bind('<ButtonRelease-1>',fonction)
    Quand j'exécute ce code si je coche une case cela ne décoche pas sa voisine...

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Encore un beau meli melo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fonction(var1,var2):
                        if self.var1.get() ==1:  #recuperation de la valeur du checkbutton
                            self.var2(0)
    Ceci dis votre problème c'est variable=

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Je vous remercie mais maintenant une erreur apparaît:
    après avoir corrigé mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ## n° diode ref
            label=tkinter.Label(self,text="n° diode ref",anchor="w") #création d'un label
            label.grid(column=0,row=16,pady=3) #emplacement du label
            self.var1=tkinter.IntVar()
            self.var2=tkinter.IntVar()
     
            for i in range(0,compteur_faisceaux): # pour créer deux cases à cocher par faisceau
                if dico['Energy'+ str(i+1)]=='6': # si l'énergie était de 6 MV
                    def fonction(var1,var2):
                        if self.var1.get() ==1:  #recuperation de la valeur du checkbutton
                            self.var2(0)
                        if self.var2.get()==1:
                            self.var1(0)
                    #création des checkbutton au début sans clic
                    self.checkbutton1=tkinter.Checkbutton(self,text="1",variable=self.var1,onvalue=1,offvalue=0) #création d'une case à cocher pour 1
                    self.checkbutton1.grid(column=1+i,row=16,sticky='W') #emplacement de la case à cocher
                    self.checkbutton1.bind('<ButtonRelease-1>',fonction)
                    self.checkbutton2=tkinter.Checkbutton(self,text="11",variable=self.var2,onvalue=1,offvalue=0) #création d'une case à cocher pour 11
                    self.checkbutton2.grid(column=1+i,row=16,sticky='E') #emplacement de la case à cocher
                    self.checkbutton2.bind('<ButtonRelease-1>',fonction)
    je me retrouve avec cette erreur lorsque je coche une case:
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
    TypeError: fonction() takes exactly 2 arguments (1 given)

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Puisque vous utilisez self.var1.get/self.var2.get vous n'avez pas besoin de les donner en arguments.
    .bind() donne à la fonction une instance contenant les informations sur l'event en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    >>> import Tkinter as tk
    >>> def callback(event):
    ...     print event
    ... 
    >>> root = tk.Tk()
    >>> root.bind('<1>', callback)
    '3077372780Lcallback'
    >>> root.mainloop()
    <Tkinter.Event instance at 0xb73f5c2c>
    >>> def callback(event):
    ...     print dir(event)
    ... 
    >>> root = tk.Tk()
    >>> root.bind('<1>', callback)
    '3077372900Lcallback'
    >>> root.mainloop()
    ['__doc__', '__module__', 'char', 'delta', 'height', 'keycode', 'keysym', 'keysym_num', 'num', 'send_event', 'serial', 'state', 'time', 'type', 'widget', 'width', 'x', 'x_root', 'y', 'y_root']
    Maintenant si vous utilisez votre 'fonction' autant pour un bind qu'un command, d'un Widget Button par exemple, pour pouvez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def fonction(event=None):
    ainsi si ce qui appelle la fonction est le bind le None seras remplacé par l'argument donné par le bind et si c'est un 'command', qui lui ne donne pas d'argument cela resteras None.

    Ceci dit ce n'était qu'une note, votre problème (et celui de votre autre post) est que vous utilisez for pour créer une série de Widget.

    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. [AC-2003] inserer une requete sql dans une case à cocher
    Par facteur dans le forum VBA Access
    Réponses: 4
    Dernier message: 26/05/2015, 14h41
  2. Réponses: 27
    Dernier message: 22/03/2014, 15h24
  3. activer/désactiver une cellule à partir d'une case à cocher
    Par gc007 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/04/2012, 18h33
  4. [Dojo] Grid: cocher une case et décocher les autres
    Par hasnaa1988 dans le forum Bibliothèques & Frameworks
    Réponses: 8
    Dernier message: 31/12/2009, 15h12
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo