Canvas Objekt nicht verschiebbar!

Fragen zu Tkinter.
Antworten
pantoffeltierchen
User
Beiträge: 16
Registriert: Donnerstag 30. November 2006, 17:48
Wohnort: Berlin
Kontaktdaten:

Hi,

so nach ausgiebigen Ausprobieren und nachlesen, muss ich nun ins Forum schreiben ich komm einfach nicht weiter!

Probemstellung:

ich habe in der Datei grafik.py mehrer Canvasobjekte erstellt, Rechteck, Ellipse... aus diesen Objekten haben ich mir auf einer Zeichenfläche ein neues Objekt zusammen gebastelt, z.B.: nen Auto^^ oder was auch immer

dieses neue Objekt packe ich in eine Class und möchte diese nun mit Attributen bestücken so wie meine anderen Canvas Objekte, soweit so gut, nun folgendes Problem da die neue Class nicht nur ein Objekt ist sondern aus mehreren (Rechtecken, Ellipsen) besteht kann ich es nicht mehr verschieben!

Hier meine Quelltexte:

grafik.py

Code: Alles auswählen

   def setPos(self,ax1,ay1,ax2,ay2):
      """
      Vor.: das Grafik-Objekt ist initialisiert, ax1,ay1,ax2,ay2 sind Integer
      Erg.: die linke obere Ecke ist auf ax1,ay1, die rechte untere Ecke auf
            ax2, ay2 gesetzt
      """
      self.X1=ax1
      self.Y1=ay1
      self.X2=ax2
      self.Y2=ay2

Code: Alles auswählen

   def pos_versetzen_um(self,dx,dy):
      """
      Vor.: das Grafik-Objekt ist initialisiert, dx, dy sind Integer
      Erg.: das Grafik-Objekt ist um dx in der Waagerechten und um
            dy in der Senkrechten verschoben
      """
      self.X1=self.X1+dx
      self.X2=self.X2+dx
      self.Y1=self.Y1+dy
      self.Y2=self.Y2+dy
hier die Objekte:

Code: Alles auswählen

class Linie(Figur):
   """
   /* Klasse Linie
   """
   def __init__(self):
      Figur.__init__(self)
      x = self.getFarbe()
      self.grafObj=Canvas.Line(Figur.ZF,(self.X1, self.Y1),(self.X2, self.Y2)\
                                                         , {"fill": x})

   def zeigen(self):
      self.grafObj.config(fill=self.getFarbe())
      self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2)))

class Ellipse(Figur):
   """
   /* Klasse Ellipse
   """
   def __init__(self):
      Figur.__init__(self)
      x = self.getFarbe()
      y = self.getFuellfarbe()
      self.grafObj=Canvas.Oval(Figur.ZF, (self.X1, self.Y1), \
                             (self.X2, self.Y2), {"outline": x, "fill": y})

   def zeigen(self):
      self.grafObj.config(fill=self.getFuellfarbe(),outline=self.getFarbe())
      self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2)))



class Rechteck(Figur):
   """
   /* Klasse Rechteck
   """
   def __init__(self):
      Figur.__init__(self)
      x = self.getFarbe()
      y = self.getFuellfarbe()
      self.grafObj=Canvas.Rectangle(Figur.ZF, (self.X1, self.Y1), \
                             (self.X2, self.Y2), {"outline": x, "fill": y})

   def zeigen(self):
      self.grafObj.config(fill=self.getFuellfarbe(),outline=self.getFarbe())
      self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2)))

und nu meine neue Class:

Code: Alles auswählen

class Auto(Kreis, Buntrechteck):

    def __init__(self,farbe):

        self.a=Buntrechteck(50, 200, 150, 300, farbe)
        self.b=Buntrechteck(10, 240, 200, 300, farbe)
        self.k1=Kreis(50,300,30, farbe)
        self.k2=Kreis(150,300,30,farbe)
        
        
    def setPos(self,ax1,ay1,ax2,ay2):

        pass
    
    def verschieben_um(self, dx,dy):

        self.pos_versetzen_um(dx,dy)
        self.zeigen()

    def langsam_wandern_um(self,dx):

        i =0
        while i< abs(dx):
            if dx<0:
                delta = -2
            else: delta = 2
            self.verschieben_um(delta,0)
            i+=2
            time.sleep(0.1)
            meinZeichenblatt.refresh()#damit man etwas sieht
und hier die Fehlermeldung:

Code: Alles auswählen

>>> a.langsam_wandern_um(10)
Traceback (most recent call last):
  File "<pyshell#60>", line 1, in <module>
    a.langsam_wandern_um(10)
  File "D:\Daten\auto.py", line 62, in langsam_wandern_um
    self.verschieben_um(delta,0)
  File "D:\Daten\auto.py", line 45, in verschieben_um
    self.pos_versetzen_um(dx,dy)
  File "D:\Daten\grafik.py", line 184, in pos_versetzen_um
    self.X1=self.X1+dx
AttributeError: Auto instance has no attribute 'X1'
>>> 
BlackJack

Blöde Antwort: Aber `Auto` hat kein Attribut `X1`. Das sagt die Fehlermeldung recht deutlich.

Ich sehe im Quelltext auch nicht wo das herkommen sollte. Wo wird das zugewiesen?

Ausserdem ist die Klassenbeziehung zwischen `Auto` und `Kreis`/`Buntrechteck` nicht ganz sauber. Vererbung drückt eine "ist eine"-Beziehung aus. Ein Auto ist aber kein Kreis/Rechteck sondern *besteht* aus solchen Objekten. Diese Beziehung nennt man Komposition.

Man könnte `Auto` von `Figur` erben lassen, allerdings bin ich mir anhand des gezeigten Quelltextes nicht ganz sicher, ob Du `Figur` überhaupt brauchst. Gibt's da irgendwelche gemeinsame Funktionalität von allen abgeleiteten Figuren oder ist das eine rein abstrakte Klasse?
pantoffeltierchen
User
Beiträge: 16
Registriert: Donnerstag 30. November 2006, 17:48
Wohnort: Berlin
Kontaktdaten:

das is eine abstrakte Class, denk ich jendenfalls


X1 ist nirgenswo festgelegt aber ich weiß auch gar net was ich da festlegen soll, ich habs schon probiert mir einigen sachen, aber ich weiß auch gar net worauf er das bezieht!!


Soll ich den ganzen Quelltext reinstellen?
BlackJack

Ich dachte der Quelltext ist von Dir? Wieso weisst Du dann nicht was `self.X1` sein soll, Du hast es doch geschrieben!?
pantoffeltierchen
User
Beiträge: 16
Registriert: Donnerstag 30. November 2006, 17:48
Wohnort: Berlin
Kontaktdaten:

ja is einiges von mir! aber die Zeichenoberfläche habe ich net programmiert! das würde ich alles gar net so hinbekommen!

ich hab die Attribute für neue Objekte geschrieben und so...
Antworten