Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur sur un canvas avec Tkinter

AttributeError: 'NoneType' object has no attribute 'bind'

Sujet résolu
    13 février 2017 à 22:52:30

    bonsoir,

    je me tourne vers vous car j'ai un problème avec mon code.

    je cherche à dessiner dans un canvas avec la librairie Tkinter mais à chaque foi que je veux le lancer il m'affiche un message d'erreur!

    Traceback (most recent call last):
      File "t.py", line 105, in <module>
        app = simpleapp_tk(None)
      File "t.py", line 90, in __init__
        self.initialize()
      File "t.py", line 95, in initialize
        self.canvas.bind("<B1-Motion>", self.creation_ligne)
    AttributeError: 'NoneType' object has no attribute 'bind'
    

    si je comprend bien pour lui il y à pas d'attribut bind mais normalement c'est une méthode :(

    je suis pas sur mais j'ai l'impression qu'il pense que je veux connecter bind à ma classe

    je vous donne mon code. si quelqu'un pourrait m'aider a comprendre d'ou vient l'erreur 

    from tkinter import *
    class simpleapp_tk(Tk):
        def __init__(self,parent):
            Tk.__init__(self,parent)
    
            self.initialize()
    
        def initialize(self):
            
            self.canvas = Canvas(self,background = 'yellow').grid(row=0,column=0,columnspan=1,sticky='NSEW')
            canvas.bind("<B1-Motion>", creation_ligne)
    
    
            self.grid_columnconfigure(0,weight=1)
            self.grid_rowconfigure(0,weight=1)
    
        def creation_ligne(event):
        	self.canvas.create_rectangle((event.x,event.y),(event.x,event.y),fill = 'red')
    
    if __name__ == "__main__":
        app = simpleapp_tk(None)
        app.title("MNIST")
        app.resizable(False,False)
        app.mainloop()
    

    par contre ce que je ne comprend pas aussi c'est que ce morceau de code hors class fonctionne tres bien !

    from tkinter import *
    root = Tk()
    
    def key(event):
        print ("pressed", repr(event.char))
    
    def callback(event):
    	canvas.create_rectangle((event.x,event.y),(event.x,event.y),fill = 'red')
    	print ("clicked at", event.x, event.y)
    
    canvas= Canvas(root, width=1000, height=1000)
    canvas.bind("<Key>", key)
    canvas.bind("<B1-Motion>", callback)
    canvas.pack()
    
    root.mainloop()
    

    merci d'avance!!

    -
    Edité par ledouxflorian1 13 février 2017 à 22:53:09

    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2017 à 23:28:28

      Erreur classique. Les objets tkinter doivent être créés et placés en deux temps (lorsqu'on veut garder une référence explicite):

      self.canvas = Canvas(self,background = 'yellow')
      self.canvas.grid(row=0,column=0,columnspan=1,sticky='NSEW')
      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
      Anonyme
        14 février 2017 à 7:25:32

        Et en même temps ça permettra de respecter la PEP8 !
        • Partager sur Facebook
        • Partager sur Twitter
          14 février 2017 à 12:14:33

          Genial!! mon programme fonctionne effectivement merci pour le coup de main et pour le lien :)
          • Partager sur Facebook
          • Partager sur Twitter

          erreur sur un canvas avec Tkinter

          × 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