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

Python Discussion :

Problème avec Checkbutton (Tkinter) [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Problème avec Checkbutton (Tkinter)
    Bonjour à tous,

    Ça fait 2 jours que je m'arrache les cheveux sur le problème suivant:
    Voici un petit programme pour utiliser la fonction "Checkbutton" du module Tkinter :

    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
    from tkinter import *
     
    master = Tk()
     
    var = IntVar()
     
    def actualiser():
        label1.config(text = var.get())
     
    c = Checkbutton(master, text = "Bouton", variable = var)
    c.grid(column = 0, row = 1)
    frame = Frame(master)
    label1 = Label(frame, text = var)
    label1.pack(side = TOP)
    frame.grid(column=0, row=0)
    bouton = Button(master, text="actualiser", command = actualiser)
    bouton.grid(column = 0, row = 2)
     
    master.mainloop()
    Ça donne une fenêtre avec un checkbutton qu'on coche ou non et un bouton "actualiser" qui affiche la valeur du checkbutton (1 quand coché et 0 quand non coché) :
    Nom : 0.jpg
Affichages : 969
Taille : 6,8 Ko
    Nom : 1.jpg
Affichages : 946
Taille : 7,1 Ko

    Le programme fonctionne nickel mais quand je l'insère dans un programme plus gros en tant que fonction :
    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
    from tkinter import *
     
    def fonc():
        master = Tk()
     
        var = IntVar()
     
        def actualiser():
            label1.config(text = var.get())
     
        c = Checkbutton(master, text = "Bouton", variable = var)
        c.grid(column = 0, row = 1)
        frame = Frame(master)
        label1 = Label(frame, text = var)
        label1.pack(side = TOP)
        frame.grid(column=0, row=0)
        bouton = Button(master, text="actualiser", command = actualiser)
        bouton.grid(column = 0, row = 2)
     
    root = Tk()
     
    Bouton = Button(root, text="Test", command=fonc)
    Bouton.pack()
     
    root.mainloop()
    J'appelle la fonction avec un bouton et SURPRISE! Ça ne marche plus...
    Je ne comprends vraiment pas pourquoi! Pouvez-vous m'aider?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Checkbutton() est un objet de la librairie GUI Tkinter.

    Pour comprendre ce qui vous arrive sans voir le contexte AUTOUR de def fonc()...# end def, cela risque d'être particulièrement épineux.

    Je consulte mon sorcier-shaman, nous allons sacrifier une dizaine de moutons, une vingtaine de vaches et de taureaux, faire quelques danses rituelles et ensuite je reviens vers vous... à moins que vous ne publiiez le code dans son intégralité afin que je puisse y voir plus clair entretemps, bien entendu.

    @+.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Ah oui désolé C'est bon j'ai modifié mon message avec le code en entier

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par st3ph31 Voir le message
    Bonjour à tous,

    Ça fait 2 jours que je m'arrache les cheveux sur le problème suivant:
    Le programme fonctionne nickel mais quand je l'insère dans un programme plus gros en tant que fonction :
    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
    from tkinter import *
     
    def fonc():
        master = Tk()
     
        var = IntVar()
     
        def actualiser():
            label1.config(text = var.get())
     
        c = Checkbutton(master, text = "Bouton", variable = var)
        c.grid(column = 0, row = 1)
        frame = Frame(master)
        label1 = Label(frame, text = var)
        label1.pack(side = TOP)
        frame.grid(column=0, row=0)
        bouton = Button(master, text="actualiser", command = actualiser)
        bouton.grid(column = 0, row = 2)
     
    root = Tk()
     
    Bouton = Button(root, text="Test", command=fonc)
    Bouton.pack()
     
    root.mainloop()
    J'appelle la fonction avec un bouton et SURPRISE! Ça ne marche plus...
    Je ne comprends vraiment pas pourquoi! Pouvez-vous m'aider?

    Merci d'avance
    OK, le problème est tout bête : vous utilisez deux fois Tk().

    La documentation officielle de Tkinter n'est pas très explicite à ce sujet : http://infohost.nmt.edu/tcc/help/pub...web/index.html

    L'objet Tk() n'est pas une fenêtre principale, c'est en réalité le proxy qui sert d'interface entre le GUI écrit en Tcl/Tk et Python (d'où le Tkinter = Tk interface) - disons pour faire simple qu'à chaque fois que vous appelez Tk(), vous appelez un interpréteur Tkinter à part entière.

    Le fait que cet interpréteur Tk() appelle à son tour une fenêtre principale Toplevel() de manière totalement transparente pour le programmeur est un autre problème.

    Pour un programme donné, vous n'avez besoin que d'un seul Tk() à la fois et rien de plus.

    Donc si c'est une fenêtre autonome que vous voulez, vous devez modifier master = Toplevel() dans votre fonction def fonc().

    Exemple (lien "Sélectionner tout" puis copiez/coller dans un fichier script de test puis lancez le fichier pour voir ce que cela donne) :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    def fonc ():
        """
            décrivez ici ce que fait votre fonction
            exemple:
            test objet Checkbutton()
        """
        master = Toplevel()
        var = IntVar()
        # sous-fonction
        def actualiser ():
            label1.configure(text=var.get())
        # end def
        label1 = Label(master)
        label1.pack()
        Checkbutton(master, text="Bouton", variable=var, command=actualiser).pack()
        actualiser()
    # end def
     
    # programme principal
    root = Tk()
    root.title("test")
    Button(root, text="Test", command=fonc).pack(padx=50, pady=20)
    root.mainloop()
    Et là, ça fonctionnera.

    @+.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    OK, le problème est tout bête : vous utilisez deux fois Tk().

    La documentation officielle de Tkinter n'est pas très explicite à ce sujet : http://infohost.nmt.edu/tcc/help/pub...web/index.html

    L'objet Tk() n'est pas une fenêtre principale, c'est en réalité le proxy qui sert d'interface entre le GUI écrit en Tcl/Tk et Python (d'où le Tkinter = Tk interface) - disons pour faire simple qu'à chaque fois que vous appelez Tk(), vous appelez un interpréteur Tkinter à part entière.

    Le fait que cet interpréteur Tk() appelle à son tour une fenêtre principale Toplevel() de manière totalement transparente pour le programmeur est un autre problème.

    Pour un programme donné, vous n'avez besoin que d'un seul Tk() à la fois et rien de plus.

    Donc si c'est une fenêtre autonome que vous voulez, vous devez modifier master = Toplevel() dans votre fonction def fonc().

    Exemple (lien "Sélectionner tout" puis copiez/coller dans un fichier script de test puis lancez le fichier pour voir ce que cela donne) :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    def fonc ():
        """
            décrivez ici ce que fait votre fonction
            exemple:
            test objet Checkbutton()
        """
        master = Toplevel()
        var = IntVar()
        # sous-fonction
        def actualiser ():
            label1.configure(text=var.get())
        # end def
        label1 = Label(master)
        label1.pack()
        Checkbutton(master, text="Bouton", variable=var, command=actualiser).pack()
        actualiser()
    # end def
     
    # programme principal
    root = Tk()
    root.title("test")
    Button(root, text="Test", command=fonc).pack(padx=50, pady=20)
    root.mainloop()
    Et là, ça fonctionnera.

    @+.
    D'accord, merci beaucoup pour toutes ces explications!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pensez à cliquer sur

    Merci.

    @+.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec tkinter canvas.configure
    Par az-steak dans le forum Général Python
    Réponses: 9
    Dernier message: 29/05/2013, 22h48
  2. MacOS : problème avec Tkinter.Menu
    Par nymformaticien dans le forum Tkinter
    Réponses: 1
    Dernier message: 10/06/2010, 11h13
  3. Problème avec un décompte simple sous Tkinter
    Par bigboss560 dans le forum Tkinter
    Réponses: 2
    Dernier message: 21/02/2010, 14h10
  4. Problème avec PyDEV et Tkinter
    Par divpload dans le forum EDI/RAD
    Réponses: 1
    Dernier message: 15/06/2009, 20h25
  5. problème avec méthode 'constructeur' sur tkinter()
    Par velight dans le forum Tkinter
    Réponses: 8
    Dernier message: 23/02/2009, 12h35

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