StarPlot

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

StarPlot

Beitragvon Tolga1979 » Donnerstag 15. Januar 2009, 17:38

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=]
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()
[/code]

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

Beitragvon martin101986 » Donnerstag 15. Januar 2009, 21:15

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

Beitragvon Tolga1979 » Donnerstag 15. Januar 2009, 22:21

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[i]["Bezeichnung"]))
KeyError: 'Bezeichnung'


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

Beitragvon BlackJack » Donnerstag 15. Januar 2009, 22:49

@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

Beitragvon HWK » Sonntag 18. Januar 2009, 13:32

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder