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 :

Écraser un canvas (Tkinter)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Par défaut Écraser un canvas (Tkinter)
    Bonjour, je débute sur python et mon objectif est de développer une application assez simple sous tkinter.

    Je rencontre quelques problèmes et j'espère pouvoir les résoudre avec vous
    Mon problème est le suivant : lorsque je clique sur un bouton, je récupère une valeur depuis une spinbox(1,2,3,...) et en fonction de la valeur j'affiche un canvas (un carré). le premier clique fonctionne (par exempe 1=carrée rouge) mais lorsque je décide de cliquer à nouveau, un deuxième canvas s'affiche au dessus du premier, comme si je les empilais.. Or je voudrai effacer le premier pour le remplacer par le deuxième.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def Show(self):
            choix = self.spinbox.get()
            if choix == "1":
     
                canvas = Canvas(self.frameRight, height=100, width=300,bg="red")
                canvas.create_line(0,0,100,300)
                canvas.pack()
     
            if choix == "2":
     
                canvas = Canvas(self.frameRight, height=100, width=300,bg="blue")
                canvas.create_line(0,0,100,300)
                canvas.pack()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Le canvas, une fois créé peut être modifié: canvas.delete('all') pour détruire tous les items qu'il contient, canvas.configure(bg='color') pour en changer les attributs...
    C'est quand même plus propre de défaire pour refaire. Au cas où, .destroy() va détruire le widget.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Bonjour, je débute sur python et mon objectif est de développer une application assez simple sous tkinter.

    Je rencontre quelques problèmes et j'espère pouvoir les résoudre avec vous
    Mon problème est le suivant : lorsque je clique sur un bouton, je récupère une valeur depuis une spinbox(1,2,3,...) et en fonction de la valeur j'affiche un canvas (un carré). le premier clique fonctionne (par exempe 1=carrée rouge) mais lorsque je décide de cliquer à nouveau, un deuxième canvas s'affiche au dessus du premier, comme si je les empilais.. Or je voudrai effacer le premier pour le remplacer par le deuxième.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def Show(self):
            choix = self.spinbox.get()
            if choix == "1":
     
                canvas = Canvas(self.frameRight, height=100, width=300,bg="red")
                canvas.create_line(0,0,100,300)
                canvas.pack()
     
            if choix == "2":
     
                canvas = Canvas(self.frameRight, height=100, width=300,bg="blue")
                canvas.create_line(0,0,100,300)
                canvas.pack()
    Bonsoir,
    Deux possibilités:
    - ne pas redessiner le "canvas" et se contenter de modifier la couleur…
    - effacer l'ancien "canvas" avant d'en dessiner un nouveau.

    Clodion

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Par défaut
    Super cela fonctionne !
    Je continue à développer et je tombe encore sur un léger problème. Je m'explique, Je souhaite créer dynamiquement des Entry en fonction du nombre d'utilisateur choisi (2 utilisateurs choisis = 2 Entry). Mon problème est : comment faire pour récupérer le contenu de chaque entry sachant qu'ils sont tous déclarés avec le même nom de variable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i=0
            for i in range(conver):
                TLabel = Label(top,text="User "+str(i))
                TEntry = Entry(top,textvariable=name)
                TLabel.grid(row=i)
                TEntry.grid(row=i,column=1)
    Je viens d'éditer mon message, du coup j'ai utiliser des listes pour stocker mes widget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in range(conver):
                self.labels.append(Label(top,text="User "+str(i)))       
                self.entry.append(Entry(top,textvariable=name))
                self.labels[i].grid(row=i)
                self.entry[i].grid(row=i,column=1)
    Le problème maintenant est que lorsque j'essaye de taper quelque chose dans une des entry, toutes mes entry écrivent la même chose. Elles sont liées alors que j'aimerais qu'elles soient distinctes

  5. #5
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Je viens d'éditer mon message, du coup j'ai utiliser des listes pour stocker mes widget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in range(conver):
                self.labels.append(Label(top,text="User "+str(i)))       
                self.entry.append(Entry(top,textvariable=name))
                self.labels[i].grid(row=i)
                self.entry[i].grid(row=i,column=1)
    Le problème maintenant est que lorsque j'essaye de taper quelque chose dans une des entry, toutes mes entry écrivent la même chose. Elles sont liées alors que j'aimerais qu'elles soient distinctes
    Bonsoir,
    Quelle variable est utilisée en tant que "textvariable"?
    -> ici, manifestement, c'est la variable "name".
    D'où vient-elle? Est-ce bien une "StringVar"?
    En tous cas, avec la même variable dans les différentes instances, il y a un gros problème!

    Clodion

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Par défaut
    Oui il s'agit bien d'une StringVar().
    Que me proposes-tu ?

    Par variable Tk, tu veux parler du self ? Je suis vraiment nouveau et je ne comprend pas tout ce que je fais en réalité. Je devrais donc créer une variable différente pour chaque entry ? Je ne peux pas mettre toutes ces données dans un seul tableau et ensuite je les récupère avec l'indice?

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Oui il s'agit bien d'une StringVar().
    Que me proposes-tu ?
    Bonsoir,
    Ainsi qu'écrit plus haut, il faut plusieurs variables…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter as tk
     
    fen = tk.Tk()
     
    ent = []
    nom = []
    for x in range(2):
        nom.append(tk.StringVar())
        ent.append(tk.Entry(textvariable=nom[x]))
        ent[x].pack()
    fen.mainloop()
    En remplaçant "nom[x]" par "nom", vous retrouvez votre problème.

    Clodion

    PS: StringVar est une variable tkinter (différente d'une variable Python)

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Oui il s'agit bien d'une StringVar().
    Que me proposes-tu ?
    Vous ouvrez votre documentation et vous regardez comment s'utilise le widget Entry.
    Lorsque vous ne comprenez pas trop ce que çà raconte, vous essayez de voir à la console Python ou via un petit bout de code ce que çà fait et vous essayez de voir comment lui faire faire ce que vous en attendez.
    note: ce n'est pas en montrant un petit bout de code qu'on peut comprendre ce que vous voulez en faire. Pas facile de proposer quoi que ce soit dans ces conditions. Pour pasticher sur le code de Clodion, vous pourriez écrire (sans StringVar):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    entries = []
    for x in range(2):
        w = tk.Entry()
        w.pack()
        entries.append(w)
     
    tk.mainloop()
    mais c'est "useless" (car çà ne dit rien sur quoi en faire après).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par DimKlen Voir le message
    Mon problème est : comment faire pour récupérer le contenu de chaque entry sachant qu'ils sont tous déclarés avec le même nom de variable ?
    Pourquoi, dans ce cas, associer vos entry à une Variable Tk, ce n'est qu'optionel...
    Et si vous voulez utilisez cette option, pourquoi les associer à la même Variable Tk?

    Le code ne fait que ce que vous lui demandez de faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Python 3.X] Deplacer Canvas Tkinter
    Par Cysou333 dans le forum Tkinter
    Réponses: 1
    Dernier message: 11/07/2015, 23h01
  2. Canvas Tkinter image introuvable
    Par Displayed dans le forum Général Python
    Réponses: 4
    Dernier message: 16/09/2014, 01h09
  3. Effets 'néon' dans un Canvas (Tkinter only svp)
    Par PauseKawa dans le forum Tkinter
    Réponses: 3
    Dernier message: 17/12/2011, 20h56
  4. [Tkinter].... Canvas: effacer un objet
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/01/2006, 12h55
  5. [Tkinter] Canvas -> superposition et z-index ?
    Par Olivier_ dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/12/2005, 09h05

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