Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter clic droit sur un bouton

Sujet résolu
    18 mai 2022 à 19:12:02

    Bonjour, je fais un démineur en utilisant tkinter comme librairie.

    J'ai cherché sur internet comment exécuter une fonction (hormis le paramètre "command=" quand on fait un clic gauche) quand on fait un clic droit sur un Button tkinter. Je n'ai rien trouvé à ce sujet là..

    Je ne pense pas que cela serait possible, car quand on clic droit sur le bouton, il ne s'enfonce pas.. si vous auriez une autre alternative.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2022 à 19:27:09

      Il suffit de lié l'action clic droit au bouton

      bouton.bind("<Button-3>", action_clic_droit)



      -
      Edité par Nephthys 18 mai 2022 à 19:28:54

      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2022 à 19:40:18

        Nephthys a écrit:

        Il suffit de lié l'action clic droit au bouton

        bouton.bind("<Button-3>", action_clic_droit)



        -
        Edité par Nephthys il y a 5 minutes

        self.button = Button(screen, width=SIZE_CASE, height=SIZE_CASE // 2, command=lambda: self.utiliser())
        self.button.bind("<Button-3>", lambda: self.clic_droit())
        self.button.grid(row=self.x, column=self.y, sticky="NSEW")
        
        def clic_droit(self):
            print("aaa")


        Ah d'accord je ne pensais pas que ce serait aussi simple, en effet j'ai pas pris le temps de lire sur internet désolé...

        J'ai un problème, maintenant quand je fais un clic droit sur le bouton, il m'affiche ce message d'erreur:

        Traceback (most recent call last):
          File "C:\Users\damie\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
            return self.func(*args)
        TypeError: Bouton.__init__.<locals>.<lambda>() takes 0 positional arguments but 1 was given

        EDIT:

            def clic_droit(self, *args):
                print("aaa")

        Je viens de trouver, en fait la fonction que j'appelle dans le button.bind envoi 1 paramètre automatiquement, il faut donc prévoir de la place (même si c'est inutile) dans notre fonction (ici *args) pour qu'il n'y ait pas d'erreurs.

        Merci pour ton aide :)

        -
        Edité par Damien_G 18 mai 2022 à 19:58:06

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          18 mai 2022 à 20:08:32

          Salut,

          Heu non pas vraiment, car ta fonction ou méthode attend en argument un event .

          Un exemple avec les 3 boutons de la souris sur un Label :

          import tkinter as tk
          
          def left_click(event):
              event.widget.configure(bg="green")
          
          def right_click(event):
              event.widget.configure(bg="red")
          
          def middle_click(event):
              event.widget.configure(bg="yellow")
          
          root = tk.Tk()
          root.geometry("100x80")
          label = tk.Label(root, width=20, height=20, bg="gray")
          label.pack(padx=20, pady=20)
          
          label.bind("<Button-1>", left_click)
          label.bind("<Button-2>", right_click)
          label.bind("<Button-3>", middle_click)
          
          root.mainloop()



          -
          Edité par Anonyme 18 mai 2022 à 20:22:32

          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2022 à 0:55:39

            Diablo76 a écrit:

            Salut,

            Heu non pas vraiment, car ta fonction ou méthode attend en argument un event .

            Un exemple avec les 3 boutons de la souris sur un Label :

            import tkinter as tk
            
            def left_click(event):
                event.widget.configure(bg="green")
            
            def right_click(event):
                event.widget.configure(bg="red")
            
            def middle_click(event):
                event.widget.configure(bg="yellow")
            
            root = tk.Tk()
            root.geometry("100x80")
            label = tk.Label(root, width=20, height=20, bg="gray")
            label.pack(padx=20, pady=20)
            
            label.bind("<Button-1>", left_click)
            label.bind("<Button-2>", right_click)
            label.bind("<Button-3>", middle_click)
            
            root.mainloop()



            -
            Edité par Diablo76 il y a environ 22 heures

            Alors oui je vois ce que tu veux dire, mais dans mon cas je n'en ai pas besoin du event:

                def clic_droit(self, *args):
                    if self.relief == self.button['relief'] and not self.button['state'] == 'disabled':
                        if not self.button['image']:
                            self.button.config(image=flag_img)
                        elif self.button['image'] == 'pyimage2':
                            self.button.config(image='')
                    # print(self.button['image'])

            C'est pour placer/retirer le drapeau quand on fait un clic droit sur un bouton, donc je n'ai pas vraiment besoin d'utiliser event


            -
            Edité par Damien_G 20 mai 2022 à 0:56:05

            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2022 à 11:51:50

              ce que Diablo76 voulait dire c'est que tu fais que ta fonction est dans un bind, elle doit attendre un paramètre de type Event (appelé event ou evt par convention/habitude) qui donne le contexte de l'appel, ensuite, on l'utilise ou pas selon le besoin http://tkinter.fdex.eu/doc/event.html#ecrire-son-gestionnaire-la-classe-event
              • Partager sur Facebook
              • Partager sur Twitter
                20 mai 2022 à 13:38:17

                umfred a écrit:

                ce que Diablo76 voulait dire c'est que tu fais que ta fonction est dans un bind, elle doit attendre un paramètre de type Event (appelé event ou evt par convention/habitude) qui donne le contexte de l'appel, ensuite, on l'utilise ou pas selon le besoin http://tkinter.fdex.eu/doc/event.html#ecrire-son-gestionnaire-la-classe-event


                Oui merci pour ton retour, j'avais bien compris ce qu'il voulait dire :)
                • Partager sur Facebook
                • Partager sur Twitter

                Tkinter clic droit sur un bouton

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown