StarPlot

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Tolga1979
User
Beiträge: 2
Registriert: Donnerstag 15. Januar 2009, 17:24

Hallo allerseits

ich sollte im Praktikum die unten stehende Aufgabe lösen.
Ich habe eigentlich alles soweit gemacht aber an einer stelle gibt er mir fehler aus könnte jemand mir einen tip geben.

Aufgabe:

Erstellen Sie eine Anwendung zur Visualisierung von Produkteigenschaften mit Hilfe eines sog. "Star Plot". Eine Erklärung zu
dieser Darstellungsweise finden Sie z.B. bei wikipedia (http://en.wikipedia.org/wiki/Star_plot).
Berücksichtigen Sie folgende Anforderungen:
- Es sollen 5 Eigenschaften dargestellt werden, zu jeder Eigenschaft soll es 4 Bewertungsstufen geben
- Die Bezeichnungen der Eigenschaften sollen an den Achsen ausgewiesen werden
- Je Eigenschaft soll eine Farbe verwendet werden (für Beschriftung und Achsen)
- Die Bewertungsstufen müssen durch Markierungen erkennbar sein
- In einer Datei "starplot.dat" sollen die verschiedenen darzustellenden Fälle in einer geeigneten Datenstruktur
abgelegt werden; es muss in der Anwendung möglich sein, den Fall auszuwählen und darstellen zu lassen
- Die Auswahl des Falls soll durch einen Menüeintrag und einen Schalter oder eine Combobox im Toolbar ermöglicht
werden
Als Anwendungsbeispiel können Sie die Bewertung von Kraftfahrzeugen verwenden mit den Eigenschaften
"CO2-Emmission", "Durchschnittsverbrauch", "Preis", "Motorleistung", "Drehmoment" mit entsprechenden
Bewertungsstufen.

und hier das Code

Code: Alles auswählen

import wx
import math
import csv


class Starplot(wx.Frame):
   def __init__(self, parent, title):
      wx.Frame.__init__(self, parent, wx.ID_ANY, title, size=(900, 700))
      self.SetBackgroundColour('grey')
      self.content = []
      self.choice = []
      self.vector = [0,0,0,0,0]
      self.bezeichnung = ["NULL","NULL","NULL","NULL","NULL"]
      self.ueberschrift = "NULL"
      self.colour = ["blue","green","white","brown","red"]
      wx.FutureCall(10, self.DrawControls)  
      
   def GetChoices(self):
      for i in range(len(self.content)):
         [b]self.choice.append(str(self.content[i]["Bezeichnung"]))[/b] Hier gibt er mir fehler aus
      
   def DrawControls(self):
      tb = self.CreateToolBar()
      self.LoadCSV()
      self.GetChoices()
      cbID = wx.NewId()
      
      tb.AddControl(wx.ComboBox(tb, cbID, "", size=(250,-1), choices=self.choice, style=wx.CB_DROPDOWN))
      self.Bind(wx.EVT_COMBOBOX, self.OnClickCombo, id = cbID)
      
      tb.Realize()
      self.DrawGraph()
      
   def OnClickCombo(self, event):
      #print event.GetString()
      self.ueberschrift = event.GetString()
      for i in range(len(self.content)):
         if self.content[i]["Bezeichnung"] == event.GetString():
            self.vector[0] = int(self.content[i]["Bewertungsstufe 1"])
            self.bezeichnung[0] = self.content[i]["Eigenschaft 1"]
            self.vector[1] = int(self.content[i]["Bewertungsstufe 2"])
            self.bezeichnung[1] = self.content[i]["Eigenschaft 2"]
            self.vector[2] = int(self.content[i]["Bewertungsstufe 3"])
            self.bezeichnung[2] = self.content[i]["Eigenschaft 3"]
            self.vector[3] = int(self.content[i]["Bewertungsstufe 4"])
            self.bezeichnung[3] = self.content[i]["Eigenschaft 4"]
            self.vector[4] = int(self.content[i]["Bewertungsstufe 5"])
            self.bezeichnung[4] = self.content[i]["Eigenschaft 5"]
      self.dc.Clear()
      self.DrawGraph()
      
   
         
      
   def DrawGraph(self):
      center = 600/2
      baseAngle = 72.0
      baseOffset = 60.0
      self.dc = wx.ClientDC(self)
      self.dc.Clear()
      for i in range(5):
         self.dc.SetPen(wx.Pen(self.colour[i], 3))
         self.dc.SetTextForeground(self.colour[i])
         self.Rotate(baseAngle*i, 0.0, 280.0)            #Rotate(angle,rotationCentre, offestAfterRotation=None)
         self.dc.DrawLine(center, center, self.xneu+center, self.yneu+center)
         self.dc.DrawText(self.bezeichnung[i], self.xneu+center+20, self.yneu+center)
      self.dc.SetPen(wx.Pen('black',5))
      for i in range(5):
         self.Rotate(baseAngle*i, 0.0, baseOffset)
         self.dc.DrawPoint(self.xneu+center, self.yneu+center)         
         self.Rotate(baseAngle*i, 0.0, baseOffset*2)
         self.dc.DrawPoint(self.xneu+center, self.yneu+center)
         self.Rotate(baseAngle*i, 0.0, baseOffset*3)
         self.dc.DrawPoint(self.xneu+center, self.yneu+center)
         self.Rotate(baseAngle*i, 0.0, baseOffset*4)
         self.dc.DrawPoint(self.xneu+center, self.yneu+center)
   
      self.x1 = [0,0,0,0,0]
      self.y1 = [0,0,0,0,0]
      for i in range(5):
         self.Rotate(baseAngle*i, 0.0, baseOffset*self.vector[i])
         self.x1[i] = self.xneu
         self.y1[i] = self.yneu
      
      self.dc.SetPen(wx.Pen('yellow',3))
      self.dc.DrawLine(self.x1[0]+center,self.y1[0]+center,self.x1[1]+center,self.y1[1]+center)
      self.dc.DrawLine(self.x1[1]+center,self.y1[1]+center,self.x1[2]+center,self.y1[2]+center)
      self.dc.DrawLine(self.x1[2]+center,self.y1[2]+center,self.x1[3]+center,self.y1[3]+center)
      self.dc.DrawLine(self.x1[3]+center,self.y1[3]+center,self.x1[4]+center,self.y1[4]+center)
      self.dc.DrawLine(self.x1[4]+center,self.y1[4]+center,self.x1[0]+center,self.y1[0]+center)
      
      self.dc.SetTextForeground("black")
      self.dc.DrawText(self.ueberschrift, center, 10)
      
   
   def LoadCSV(self):
      filename="starplot.dat"
      reader = csv.DictReader(file(filename, "rb"))
      for row in reader:
         self.content.append(row)
      
         
   def Rotate(self, angle, origin, length):
      self.xneu = 0.0
      self.yneu = 0.0
      angle = math.radians(angle)
      self.xneu = length*math.cos(origin)*math.cos(angle)-length*math.sin(origin)*math.sin(angle)
      self.yneu = length*math.sin(origin)*math.cos(angle)+length*math.cos(origin)*math.sin(angle)

if __name__ == "__main__":
   app = wx.App()
   Starplot(None, 'Star Plot!').Show(True)
   app.MainLoop() 
Die zugehörige .dat datei

"Bezeichnung","Eigenschaft 1","Bewertungsstufe 1","Eigenschaft 2","Bewertungsstufe 2","Eigenschaft 3","Bewertungsstufe 3","Eigenschaft 4","Bewertungsstufe 4","Eigenschaft 5","Bewertungsstufe 5"
"Smart","CO2-Emmission","1","Durchschnittsverbrauch","1","Preis","3","Motorleistung","1","Drehmoment","1"
Zuletzt geändert von Tolga1979 am Sonntag 18. Januar 2009, 16:31, insgesamt 1-mal geändert.
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo Tolga1979,

willkommen im Forum. Bitte setze den Code in Codetags. Somit ist es für andere und mich einfacher den Code zu lesen bzw. zu kopieren und auszuprobieren.

Bitte poste auch immer die Fehlermeldungen(tracebacks) die du erhalten hast, das hilft uns auch dir zu helfen. Poste mal die Fehlermeldung und dann können wir weiter schauen.

Grüße Martin
Tolga1979
User
Beiträge: 2
Registriert: Donnerstag 15. Januar 2009, 17:24

Hier das Traceback

Traceback (most recent call last):
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc.py", line 1341, in Notify
self.notify()
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14678, in Notify
self.result = self.callable(*self.args, **self.kwargs)
File "C:\Dokumente und Einstellungen\Tolga\Eigene Dateien\Studium\WS 08-09\IAS\Praktikum 3\starplot.py", line 31, in DrawControls
self.GetChoices()
File "C:\Dokumente und Einstellungen\Tolga\Eigene Dateien\Studium\WS 08-09\IAS\Praktikum 3\starplot.py", line 26, in GetChoices
self.choice.append(str(self.content["Bezeichnung"]))
KeyError: 'Bezeichnung'


Martin tut mir leid wegen den Code beim nächsten mal werde ich es machen
BlackJack

@Tolga1979: Die Fehlermedlung ist ja recht deutlich, es gibt in mindestens einem der Dictionaries keinen Schlüssel 'Bezeichnung'. Lass Dir die Daten mal ausgeben, dann siehst Du ja eventuell woran das liegen könnte.

Und arbeite das Tutorial in der Python-Dokumentation durch. Man kann über Elemente in Listen direkt iterieren, der Umweg über einen Index ist nicht nötig. ``for i in xrange(len(obj)):`` ist in 99.9% der Fälle ein "code smell".
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich habe mir nach BlackJacks Hinweis diesen Thread noch einmal angeschaut. Nach Hinzufügen der Einrückungen läuft es bei mir unter Python 2.4. Das scheint also wohl nicht von crash zu sein. :wink:
MfG
HWK
Antworten