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 :

Association évènement bouton


Sujet :

Tkinter Python

  1. #1
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut Association évènement bouton
    Bonjour

    Je suis en train d'explorer tkinter pour la conception d'une GUI selon les principes MVC. J'essaye différentes mises en place à partir de divers documents et tutoriels. Dans le code ci-dessous l'appui sur le button3 provoque bien l'affichage de Hello dans la console et le changement de la couleur du fond du bouton alternativement jaune et vert.
    Mais en plus sans que le programme se plante j'ai le message d'erreur ci-dessous à chaque appui :

    (executing lines 1 to 118 of "view.py")
    Hello
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Programmes\pyzo2015a\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
    TypeError: button3Click() missing 1 required positional argument: 'event'

    Si quelqu'un peut m'expliquer pourquoi et le remède à apporter merci beaucoup par avance.

    Voilà le 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    import tkinter as tk
    from tkinter import messagebox
    from controller import *
    from configurations import *
     
     
    class View(tk.Tk):
     
        def __init__(self, MVC_controller):
            # Héritage de la classe parente
            super().__init__()
     
            # Géometrie
            self.geometry("800x600")
     
            # Appel du controleur
            self.controller = MVC_controller
     
            # Mise en place de la fenêtre
            self.create_top_menu()
     
            # Le container principal
            self.myContainer1 = tk.Frame(self, background ='purple') ###
            self.myContainer1.pack(fill = tk.BOTH, expand=tk.YES)
     
            # frame boutons coté droit du container principal
            self.frame_boutons = tk.Frame(self.myContainer1, width=200, background="yellow") 
            self.frame_boutons.pack(side=tk.RIGHT,fill=tk.Y)
     
            # frame canvas dans le container principal 
            self.frame_canvas = tk.Frame(self.myContainer1, background="pink") 
            self.frame_canvas.pack(side=tk.RIGHT,fill=tk.BOTH)            
     
            # Maintenant nous ajoutons des bouttons à bouttons frame
            self.button1 = tk.Button(self.frame_boutons, command=self.destroy)
            self.button1.configure(text="QUIT", background= "green")
            self.button1.configure(width=10)
            self.button1.pack(fill=tk.X)
     
            # Maintenant nous ajoutons des bouttons à bouttons frame
            self.button2 = tk.Button(self.frame_boutons, command=self.destroy)
            self.button2.configure(text="BT2", background= "yellow")
            self.button2.pack(fill=tk.X)
     
            # Maintenant nous ajoutons des bouttons à bouttons frame
            self.button3 = tk.Button(self.frame_boutons, command=self.button3Click)
            self.button3.configure(text="BT3", background= "yellow")
            self.button3.pack(fill=tk.X)
            self.button3.bind("<Button-1>", self.button3Click)         
     
            # Bandeau information container secondaire
            self.myContainer2 = tk.Frame(self, height=64, background="lightblue")
            self.info_label = tk.Label(self.myContainer2, text="   White to Start the Game  ", fg=BOARD_COLOR_2)
            self.info_label.pack(side=tk.RIGHT, padx=8, pady=5)
            self.myContainer2.pack(fill=tk.X, side=tk.BOTTOM)        
     
        def button3Click(self,event):
            print("Hello")
            if self.button3["background"] == "green": 
                self.button3["background"] = "yellow"
            else:
                self.button3["background"] = "green"
     
        def create_top_menu(self):
            self.menu_bar = tk.Menu()
            self.create_file_menu()
            self.create_edit_menu()
            self.create_about_menu()
     
        def create_canvas(self, parent):
            self.canvas = tk.Canvas(parent, background="pink")
            self.canvas.pack(side=tk.LEFT,fill=tk.BOTH, padx=8, pady=8)
     
        def create_boutons_frame(self, parent):
            self.button1 = tk.Button(parent, command=self.destroy, width = 200)
            self.button1.configure(text="QUIT", background= "green")
            self.button1.configure(width=10)
            self.button1.pack(side = tk.TOP, padx=8, pady=8)   
     
        def on_about_menu_clicked(self):
            messagebox.showinfo("PROJET GUI")
     
        def on_new_game_menu_clicked(self):
            pass
     
        def on_preference_menu_clicked(self):
            pass
     
        def create_file_menu(self):
            self.file_menu = tk.Menu(self.menu_bar, tearoff=0)
            self.file_menu.add_command(label="New Game", command=self.on_new_game_menu_clicked)
            self.menu_bar.add_cascade(label="File", menu=self.file_menu)
            self.config(menu=self.menu_bar)
     
        def create_edit_menu(self):
            self.edit_menu = tk.Menu(self.menu_bar, tearoff=0)
            self.edit_menu.add_command(label="Preferences", command=self.on_preference_menu_clicked)
            self.menu_bar.add_cascade(label="Edit", menu=self.edit_menu)
            self.config(menu=self.menu_bar)
     
        def create_about_menu(self):
            self.about_menu = tk.Menu(self.menu_bar, tearoff=0)
            self.about_menu.add_command(label="About", command=self.on_about_menu_clicked)
            self.menu_bar.add_cascade(label="About", menu=self.about_menu)
            self.config(menu=self.menu_bar)
     
    def init_interface():
        MVC_controller = Controller()
        app = View(MVC_controller)
        app.mainloop()
     
    if __name__ == "__main__":
        init_interface()

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

    Citation Envoyé par P.G Voir le message
    Si quelqu'un peut m'expliquer pourquoi et le remède à apporter merci beaucoup par avance.
    A la base, des fonctions peuvent être associées à des évènements. C'est tkinter qui va appeler la fonction lorsque l'évènement se réalise (d'où le nom de callback).
    Et la fonction devra déclarer les paramètres correspondants.

    Ici, le message d'erreur dit que le callback associé à un Button ne prend pas de paramètre.

    - W

  3. #3
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par P.G Voir le message

    Si quelqu’un peut m'expliquer pourquoi et le remède à apporter merci beaucoup par avance.

    [/CODE]
    Bonjour,

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.button3 = tk.Button(self.frame_boutons, command=self.button3Click)
    tu definies ton bouton. Lorsque celui est appuyé, la fonction self.button3Click est exécutée. Cependant ta fonction demande un argument "event" d'où l'exception que tu rencontres.

    J'ignore ce que doit faire ton code et pourquoi tu executes la fonction self.button3Click à chaque clic souris (avec la méthode bind), mais si tu en as vraiment besoin (??) tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def button3Click(self,event=None):

  4. #4
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut
    Bonjour

    Merci pour vos réponses.

    OK vu, autant pour moi, pourquoi utiliser bind en effet avec un button qui par nature réagit au 'clic'.

    Ceci dis le code proposé enlève effectivement l'erreur.

    Du coup j'ai enlvé bind pour gérer en direct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            # Maintenant nous ajoutons des bouttons à bouttons frame
            self.button3 = tk.Button(self.frame_boutons, command=self.button3Click)
            self.button3.configure(text="BT3", background= "yellow")
            self.button3.pack(fill=tk.X)
     
        def button3Click(self):
            print("Hello")
            if self.button3["background"] == "green": 
                self.button3["background"] = "yellow"
            else:
                self.button3["background"] = "green"
    Connaissez-vous un lien vers un document expliquant les rouages internes de tkinter accessible ?

    En effet il y a beaucoup de site montrant des exemples dans tous les sens sous forme de recettes mais cela ne rend pas forcément autonome dès que l'on veut sortir des exemples proposés.

    Par avance merci encore.

    P.G

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

    Citation Envoyé par P.G Voir le message
    Connaissez-vous un lien vers un document expliquant les rouages internes de tkinter accessible ?
    Les liens sont répertoriés dans cette discussion du forum tkinter.

    - W

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

Discussions similaires

  1. [Débutant] associer un évènement bouton au touche un clavier
    Par bacarndiaye dans le forum C#
    Réponses: 3
    Dernier message: 30/12/2011, 19h59
  2. Réponses: 5
    Dernier message: 28/07/2006, 08h16
  3. Réponses: 2
    Dernier message: 27/04/2006, 22h59
  4. [Souris] Associer un bouton de souris
    Par GLDavid dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 26/01/2006, 09h44
  5. Réponses: 1
    Dernier message: 22/11/2005, 17h31

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