Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python] Orienté objet

Problème de communication entre objets

Sujet résolu
    27 octobre 2006 à 10:21:24

    Bonjour à tous,
    Je suis en train de développer une application orientée objet en python plustôt complexe, et j'ai besoin pour cela, de faire communiquer plusieurs objets (comme dans le jeu de bombardes dan le tuto de Gérard Swinnen). J'ai fait un petit exemple caractéristique pour que vous puissiez voir simplement mon problème : j'ai un objet App parent (dérivé d'une Frame Tkinter) dans lequel j'ai mis un Canvas, puis un deusième objet créé pour exécuter une action quelconque sur le Canvas :

    from Tkinter import *

    class Objet :
            def __init__(self, app) :
                    self.app=app
                    self.trace()
                   
            def trace(self) :
                    self.app.can.create_line(5, 5, 100, 100)
                   
    class App(Frame) :
            def __init__(self) :
                    Frame.__init__(self)
                    self.can=Canvas(self, width=150, height=150)
                    self.can.pack()
                   
    if __name__=='__main__' :
            fen=Tk()
            app=App()
            app.pack()
            fen.mainloop()
            Objet(app)


    Mais ce code me renvoie toujours l'erreur suivante :

    Traceback (most recent call last):
    File "C:\poly2.py", line 22, in ?
    Objet(app)

    File "C:\poly2.py", line 6, in
    __init__
    self.trace()

    File "C:\poly2.py", line 9, in
    trace
    self.app.can.create_line(5, 5, 100, 100)

    File "C:\Python24\lib\lib-tk\Tkinter.py", line 2090, in create_line
    return self._create('line', args, kw)

    File "C:\Python24\lib\lib-tk\Tkinter.py", line 2076, in _create
    return getint(self.tk.call(

    _tkinter.TclError: invalid command name ".11595368.11595608"


    Pouvez-vous m'aider ???

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      27 octobre 2006 à 10:31:58

      Le code qui provoque le tracement (ou traçage, c'est selon) du trait est placé après l'appel de mainloop. Or mainloop bloque le code à cet endroit en attendant un évènement, et ne rend la main au programme qu'après destruction de la fenêtre - c'est donc à ce moment là que Objet(app) est appelé, et comme il n'y a plus de fenêtre, Tk s'affole (il ne sait plus où tracer).

      Fais l'inverse, en plaçant Objet(app) avant le mainloop().
      • Partager sur Facebook
      • Partager sur Twitter
        27 octobre 2006 à 10:39:43

        Bonjour,
        Je ne comprend pas ton problème.
        Moi j'essaye ce code sous python 2.5 :
        from Tkinter import *

        class Objet :
                def __init__(self, app) :
                        self.app=app
                        self.trace()
                       
                def trace(self) :
                        self.app.can.create_line(5, 5, 100, 100)
                       
        class App(Frame) :
                def __init__(self) :
                        Frame.__init__(self)
                        self.can=Canvas(self, width=150, height=150)
                        self.can.pack()
                       
        if __name__=='__main__' :
                fen=Tk()
                app=App()
                app.pack()
                Objet(app)
                fen.mainloop()

        Et ça marche j'ai mis le Objet(app) avant le mainloop sinon il ne s'executerais jamais.
        Normalement ton erreur n'aurais en plus jamais du se produire car le mainloop aurais du être executé avant.
        En gros, c'est comme l'a dit Bigloo ;)



        Bisous, Nyu
        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2006 à 13:18:56

          ^^ Ahhh, l'erreur de débutant ...
          Désolé de vous avoir dérangé pour un truc si ...
          Merci beaucoup :)
          • Partager sur Facebook
          • Partager sur Twitter

          [Python] Orienté objet

          × 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