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 :

Annuler l'action d'un bouton Tkinter


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut Annuler l'action d'un bouton Tkinter
    Bonjour à tous,

    J'aimerai afficher ou non une grille dans la fenêtre ci dessous:

    Nom : 2020_05_08_17_06_08_Heating_Draw.png
Affichages : 1104
Taille : 26,2 Ko

    Voici une partie du code que j'utilise:

    Code python : 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
     
     
    def print_grid():
        for x in range(25, width_w - 25, 15):
            for y in range(25, height_w - 25, 15):
                canvas.create_rectangle(x, y, x + 15, y + 15,
                                        width=2, outline='grey',
                                        fill='white',
                                        tag='square')
     
    Frame1 = Frame(root, borderwidth=3, relief=GROOVE)
    Frame1.pack(side='top', padx=10, pady=10)
     
    Label(Frame1, text="Option de la grille").pack(padx=10,pady=10)
    Button(Frame1, text="Afficher", fg='navy', command=print_grid).pack(side=LEFT, padx=10, pady=10)
    Button(Frame1, text="Effacer", fg='navy', command=print_grid).pack(side=RIGHT, padx=10, pady=10)
     
    # Association clic/action
    canvas.bind("<Button-1>", action_clic_souris)
    root.mainloop()

    Je ne sais pas comment faire pour que mon deuxième bouton annule l'action du premier ? Est ce que quelqu'un sait m'aider ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par maxstilde Voir le message
    Je ne sais pas comment faire pour que mon deuxième bouton annule l'action du premier ?
    Je ne comprends pas trop ce que vous cherchez à faire si print_grid crée des rectangles dans un canvas, "annuler", c'est, à priori, juste les supprimer. (et la question pourrait être comment supprimer des items d'un Canvas).

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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    Voilà c'est ça, comment supprimer un item du canvas ?

    Je sais que ma ligne de code ci dessous en fausse, il faut que dans command=, ça supprime l'action du premier ou qui supprime tout simplement juste la grille et pas autre chose avec après il y aura un plan, des tracés, etc.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    Button(Frame1, text="Effacer", fg='navy', command=print_grid).pack(side=RIGHT, padx=10, pady=10)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par maxstilde Voir le message
    comment supprimer un item du canvas ?
    Pour supprimer un item du Canvas, c'est Canvas.delete

    avec après il y aura un plan, des tracés, etc.
    Vous allez bien vous amuser! Prenez quand même le temps de lire la documentation du Canvas car si çà sait faire plein de choses, c'est pas si intuitif que çà.

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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    J'ai essayer ceci qui pour moi devrait marché mais sans succès... Code complet:

    Code python : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
     
    from tkinter import *
     
    # Création et paramètre de la fenêtre
    root = Tk()
    width_w = 1200
    height_w = 800
     
    canvas = Canvas(root, width=width_w, height=height_w, background="white")
    canvas.pack(side=RIGHT, padx=5, pady=5)
    root.resizable(width=False, height=False)
    root.title('Heating Draw')
     
    def action_clic_souris(event):
        canvas.focus_set()
        x = event.x
        y = event.y
        i = x // 15 * 15 - 5
        j = y // 15 * 15 - 5
        canvas.create_rectangle(i, j, i + 15, j + 15, fill="green", tag="rec")
        # Création du fichier qui stock les valeurs
        with open("valeur_x_y.txt", "a+") as file:
            file.write(str(i))
            file.write(", ")
            file.write(str(j))
            file.write("\n")
            file.close()
        return
     
    def print_grid():
        if root.find_withtag('square'):
            delete('square')
        else:
            for x in range(25, width_w - 25, 15):
                for y in range(25, height_w - 25, 15):
                    canvas.create_rectangle(x, y, x + 15, y + 15,
                                            width=2, outline='grey',
                                            fill='white',
                                            tag="square")
     
    def delete(MonTag):
        root.delete(root.find_withtag(MonTag))
     
    Frame1 = Frame(root, borderwidth=3, relief=GROOVE)
    Frame1.pack(side='top', padx=10, pady=10)
    Label(Frame1, text="Option de la grille").pack(padx=10,pady=10)
     
    Button(Frame1, text="Afficher", fg='navy', command=print_grid).pack(side='left', padx=10, pady=10)
     
    # Association clic/action
    canvas.bind("<Button-1>", action_clic_souris)
    root.mainloop()

    Pycharm m'affiche le message d'erreur suivant quand je clic sur Afficher

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Users\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
    File "C:/Users/PycharmProjects/Projet CS/main.py", line 30, in print_grid
    if root.find_withtag('square'):
    File "C:\Users\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 2345, in __getattr__
    return getattr(self.tk, attr)
    AttributeError: '_tkinter.tkapp' object has no attribute 'find_withtag'

  6. #6
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 881
    Points : 1 544
    Points
    1 544
    Billets dans le blog
    4
    Par défaut
    Bonsoir,
    La méthode find_withtag() s'applique sur le canvas...(pas sur root)
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    En effet, quand je remplace le root par canvas, ça fonctionne déjà mieux mais pas encore comme il faudrait.

    Quand je clic sur affiché, il affiche bien ma grille mais quand je clic une seconde fois ( il devrait la supprimer ), rien ne se passe.

    Je vous remercie pour votre aide.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par maxstilde Voir le message
    En effet, quand je remplace le root par canvas, ça fonctionne déjà mieux mais pas encore comme il faudrait
    L'intérêt d'un tag comme 'square' est qu'on peut lui appliquer une méthode comme .delete('square'). Après sûr qu'on peut passer plusieurs identifiants à .delete mais c'est autant d'arguments, pas une liste.

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

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Salut,
    Citation Envoyé par maxstilde Voir le message
    Quand je clic sur affiché, il affiche bien ma grille mais quand je clic une seconde fois ( il devrait la supprimer ), rien ne se passe.
    C'est ta fonction delete qui pose problème :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def delete(MonTag):
        root.delete(root.find_withtag(MonTag))
    A remplacer par :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def delete(MonTag):
       canvas.delete(MonTag)

    Mais une fonction juste pour ça n'est peut-être pas vraiment utile...
    Tu pourrais t'en passer dans ta fonction print_grid en écrivant directement canvas.delete('square') à la place de delete('square'):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def print_grid():
        if canvas.find_withtag('square'):
            # delete('square')
            canvas.delete('square')
        else:...
    ---------------------

    Sinon il y a certains points que je ne comprends pas :

    - Pourquoi tu utilises des coordonnées comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = x // 15 * 15 -5
    j = y // 15 * 15 - 5
    En faisant cela tu affiches un carré même quand on clique en dehors de la grille :

    Nom : grille.PNG
Affichages : 955
Taille : 22,1 Ko

    En plus il y a parfois un décalage : parfois le carré vert ne s'affiche pas dans la case où on a cliqué mais dans la case à coté...

    Ne serait-ce mieux de placer la grille sur tout le canvas (sans marge) ?

    Es-tu sûr que c'est bien ce i et ce j que tu veux enregistrer dans ton fichier ? Je te demande cela car mon impression c'est que peut-être tu voulais enregistrer les coordonnées des cases de la grille or pour ces dernières la formule est différente, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = (x-25)//15
    j = (y-25)//15

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Merci pour ces éclaircissements.

    L’utilisateur charge une image de fond, après il a la possibilité d afficher une grille pour mieux se repérer lorsqu il clic.

    Le clic renvoit les coordonnes dans un fichier qui ensuite est lu par le programme pour faire des tracés.

    Le carré qui s affiche est juste la pour que l utilisateur de repère facilement .

    Si vous voulez , je vous envois tout le code en mp quand je l aurai terminer avec les explications

  11. #11
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Citation Envoyé par maxstilde Voir le message
    L’utilisateur charge une image de fond, après il a la possibilité d afficher une grille pour mieux se repérer lorsqu il clic.

    Le clic renvoit les coordonnes dans un fichier qui ensuite est lu par le programme pour faire des tracés.
    Oui mais avec ton code actuel les coordonnées que tu enregistres dans le fichier ne correspondent pas aux coordonnées des cliques de souris, est-ce normal ? C'est ce que tu veux ?

    De plus fait attention car ton fichier tu ne le vides jamais du coup chaque fois que tu exécutes ton code les coordonnées sont ajoutées à la suite...

    Autre point : si on clique plusieurs fois au même endroit eh bien tu vas enregistrer plusieurs fois les mêmes coordonnées...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    Non ce n est pas normal ça ...

    Pourquoi est ce que le coordonné et le clic est différent ?

    Pour le fichier oui oui c est normal je ne fais que des tests pour le moment , ou ça bloque vraiment beaucoup c est lorsque je trace mes boucles, je ne trouve pas l algorithme qui me le ferait automatiquement

  13. #13
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Citation Envoyé par maxstilde Voir le message
    Non ce n est pas normal ça ...

    Pourquoi est ce que le coordonné et le clic est différent ?
    Ben dans ton code, les coordonnées du clique c'est x et y :

    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
    def action_clic_souris(event):
        canvas.focus_set()
        x = event.x
        y = event.y
        i = x // 15 * 15 - 5
        j = y // 15 * 15 - 5
        canvas.create_rectangle(i, j, i + 15, j + 15, fill="green", tag="rec")
        # Création du fichier qui stock les valeurs
        with open("valeur_x_y.txt", "a+") as file:
            file.write(str(i))
            file.write(", ")
            file.write(str(j))
            file.write("\n")
            file.close()
        return
    Mais c'est i et j que tu enregistres dans ton fichier...

    Et je te rappelle que les coordonnées du clique x et y sont relatifs au canvas et non à la grille car il y a une marge de 25 pixels...
    Tu peux supprimer cette marge...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Points : 28
    Points
    28
    Par défaut
    J'avais mit la marge car c'est plus "beau", si je l'enlève les lignes s'arrêtent un peu n'importe où.

    Le mieux, serait d'avoir une grille de 15x15,que le carré vert fasse 15x15 également et qu'on renvoi les coordonnées de l’intersession ( cercle rouge )

    Nom : Sans titre.png
Affichages : 927
Taille : 6,1 Ko

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2019, 20h37
  2. Annulation d'une action + desactivation de boutons
    Par msarahm dans le forum Débuter
    Réponses: 1
    Dernier message: 05/12/2008, 22h51
  3. action d'un bouton
    Par Homer dans le forum ASP
    Réponses: 15
    Dernier message: 04/02/2005, 18h26
  4. [FLASH MX PRO] Action répétée sur bouton
    Par dens63 dans le forum Flash
    Réponses: 4
    Dernier message: 15/04/2004, 14h16
  5. [Flash MX] Action sur un bouton
    Par WriteLN dans le forum Flash
    Réponses: 9
    Dernier message: 20/10/2003, 14h01

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