Sizer im Dict, Parameterübergabe an Methode
Verfasst: Mittwoch 8. Juni 2005, 09:51
Hallo,
ich hab mal wieder Probleme!
Was mein letztes Posting angeht, werde ich mich wohl umorientieren und mir das von chronical_chaos mal anschauen.
Jetzt zu meinen Problemen:
1. Warum funktioniert mein GroupSizer bzw. der Tabelle nicht?
2. Wie übergebe ich die Parameter an meine Methode?
Schon im Vorraus ein Dankeschön für eure Hilfe!
Viele Grüße aus dem hohen Norden!
Jens
ich hab mal wieder Probleme!
Was mein letztes Posting angeht, werde ich mich wohl umorientieren und mir das von chronical_chaos mal anschauen.
Jetzt zu meinen Problemen:
1. Warum funktioniert mein GroupSizer bzw. der Tabelle nicht?
2. Wie übergebe ich die Parameter an meine Methode?
Code: Alles auswählen
import wx
import wx.stc
import math
import wx.lib.scrolledpanel as scrolled
import wx.lib.masked.numctrl
class Schnelleingabe(scrolled.ScrolledPanel):
def __init__(self, parent):
scrolled.ScrolledPanel.__init__(self, id=-1, name='Schnelleingabe', parent=parent, size=(700,500))
"""
Dieses Panel soll möglichst variabel gehalten werden. Später hatte ich vor, bei der Instanzierung
die 'ListeKennwerte' mit zu übergeben, um verschiedene Eingaben zu realisieren.
Nummerneingabe: ('Bezeichnung','Num','Gruppe',Wert,Minimum,Maximun,Limitiert,Nachkommastellen,Vorkommastellen,'Einheit')
Gruppe soll heißen, das die Eingabefelder einer 'Gruppe' nebeneinander abgebildet werden, nicht wie sonst untereinander.
Stringeingabe: ('Bezeichnung','Str')
Abstandhalter: ('Bezeichnung','Spa') - Bezeichnung kann '' sein, wird nicht verarbeitet!
Combobox: ('Bezeichnung','Com',Wert,[Auswahlmöglichkeiten])
Datumseingabe: ('Bezeichnung','Dat')
Tabelleneingabe: ('Bezeichnung','Tab',Design,Reihen,Spalten,Spaltenüberschriften)
Design soll später zwischen verschieden Tabellenlayouts unterscheiden, z.Z. noch nicht verarbeitet
"""
ListeKennwerte=[
('number 1','Num','TestGroup',0,0,99999,False,0,5,''),
('name','Str'),
('str2','Str'),
('number 2','Num','TestGroup',210000,0,500000,False,0,7,'[MPa]'),
('number3','Num',None,0.3,-1,0.5,True,2,1,'[]'),
('Temperature','Num',None,23,-273,999,True,0,3,'[°C]'),
('number4','Num',None,0,0,1500,False,2,4,'[N/mm²]'),
('str3','Str'),
('Date1','Dat'),
('','Spa'),
('combobox1','Com','c',['a','b','c']),
('str4','Str'),
('date2','Dat'),
('combobox2','Com','',['','','']),
('Tabellentest_a','Tab',5,7,3,[(0,"header1"),(1,"header2"),(2,"header3"),(3,'header4')]),
('Tabellentest_b','Tab',5,7,3,[(0,"header1"),(1,"header2"),(2,"header3"),(3,'header4')]),
]
self.EingabenKennwerte={}
"""Hier werden die Eingaben hinterlegt"""
self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=-1, vgap=0)
self.PartSizer={}
self.GroupSizer={}
"""Diese Dicts speichern die die Sizer der einzelnen Kennwerte bzw. Gruppen"""
self.TabellenIndex={}
"""
Hier wird hinterlegt, wieviele Tabellen für jede Tabelleneingabe vorhanden sind.
Es soll z.B. möglich sein, für die Tabelleneingabe 'Tabellentest_a' mehrere Tabellen
anzulegen.
"""
for Kennwerte in ListeKennwerte:
Bezeichnung=Kennwerte[0]
Art=Kennwerte[1]
if Art=='Num':
Group=Kennwerte[2]
Wert=Kennwerte[3]
Min=Kennwerte[4]
Max=Kennwerte[5]
Limited=Kennwerte[6]
Precicion=Kennwerte[7]
IntegerWidth=Kennwerte[8]
Einheit=Kennwerte[9]
self.Eingabe=wx.lib.masked.numctrl.NumCtrl(id = -1,
name=Bezeichnung, parent=self,
size=wx.Size(40, 21), style=0, value=Wert, min = Min, max = Max,
limited = Limited,fractionWidth=Precicion,integerWidth=IntegerWidth,groupDigits=False,
allowNone = False, allowNegative = True)
self.Label=wx.StaticText(id=-1,
label=Bezeichnung+' '+Einheit, name='Label'+Bezeichnung,
parent=self, size=wx.Size(108, 13), style=0)
self.EingabenKennwerte[Bezeichnung]=self.Eingabe
if Group==None:
"""
Wenn die Nummerneingabe keiner Gruppe zugeordnet ist, sollen
das Label und das Eingabefeld nebeneinander dargestellt werden.
"""
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[Bezeichnung].Add(self.Label, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.Eingabe, 2, border=1, flag=0)
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
else:
"""
Wenn eine Gruppe angegeben ist, sollen Label und Eingabefeld untereinander,
Kennwerte einer Gruppe aber nebeneinander dargestellt werden.
"""
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.VERTICAL)
self.PartSizer[Bezeichnung].Add(self.Label, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.Eingabe, 2, border=1, flag=0)
self.GroupSizer[Group] = wx.BoxSizer(orient=wx.HORIZONTAL)
self.GroupSizer[Group].Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
self.GroupSizer[Group].Layout()
self.MainSizer.Add(self.GroupSizer[Group], 2, border=1, flag=0)
elif Art=='Str':
self.Eingabe=wx.TextCtrl(id=-1, name='MatName',
parent=self, size=wx.Size(100, 21),
style=0, value='please enter')
self.Label=wx.StaticText(id=-1,
label=Bezeichnung, name='Label'+Bezeichnung,
parent=self, size=wx.Size(108, 13), style=0)
self.EingabenKennwerte[Bezeichnung]=self.Eingabe
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[Bezeichnung].Add(self.Label, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.Eingabe, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Layout()
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
elif Art=='Spa':
self.PartSizer[Bezeichnung] =(20,20)
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
elif Art=='Dat':
self.Eingabe=wx.DatePickerCtrl(self, size=(100,-1),
style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
self.Label=wx.StaticText(id=-1,
label=Bezeichnung, name='Label'+Bezeichnung,
parent=self, size=wx.Size(108, 13), style=0)
self.EingabenKennwerte[Bezeichnung]=self.Eingabe
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[Bezeichnung].Add(self.Label, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.Eingabe, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Layout()
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
elif Art=='Com':
Wert=Kennwerte[2]
Auswahl=Kennwerte[3]
self.Eingabe=wx.ComboBox(choices=Auswahl,
id=-1, name=Bezeichnung, parent=self,
size=wx.Size(35, 21), style=0, value=Wert)
self.Label=wx.StaticText(id=-1,
label=Bezeichnung, name='Label'+Bezeichnung,
parent=self, size=wx.Size(108, 13), style=0)
self.EingabenKennwerte[Bezeichnung]=self.Eingabe
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[Bezeichnung].Add(self.Label, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.Eingabe, 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Layout()
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
elif Art=='Tab':
self.TabellenIndex[Bezeichnung]=1
self.TabSizer={}
ID_ANOTHERRATE={}
self.AnotherRate={}
TabellenKennung=Bezeichnung+str(self.TabellenIndex[Bezeichnung])
self.PartSizer[Bezeichnung] = wx.BoxSizer(orient=wx.VERTICAL)
self.TabSizer[TabellenKennung] = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
Design=Kennwerte[2]
Rows=Kennwerte[3]
Cols=Kennwerte[4]
Header=Kennwerte[5]
self.Eingabe={}
self.Label={}
self.Eingabe[TabellenKennung] = wx.grid.Grid(id=-1, name=Bezeichnung,
parent=self, style=wx.STATIC_BORDER | wx.TAB_TRAVERSAL)
self.Eingabe[TabellenKennung].CreateGrid(Rows,Cols)
for col in xrange(0,Cols):
for row in xrange(0,Rows):
self.Eingabe[TabellenKennung].SetCellEditor(row, col, wx.grid.GridCellFloatEditor(8,4))
self.Eingabe[TabellenKennung].SetCellValue(row,col,'%s'%self.TabellenIndex[Bezeichnung])
for col, header in Header:
self.Eingabe[TabellenKennung].SetColLabelValue(col,header)
self.Label[TabellenKennung]=wx.StaticText(id=-1, label=Bezeichnung+' %s instanzierung'%self.TabellenIndex[Bezeichnung],
name='Label'+Bezeichnung, parent=self,
size=wx.Size(158, 13),style=0)
ID_ANOTHERRATE[Bezeichnung]=wx.NewId()
self.AnotherRate[Bezeichnung] = wx.Button(id=ID_ANOTHERRATE[Bezeichnung],
label='Another Rate?', name='ANOTHERRATE', parent=self, size=wx.Size(75, 23), style=0)
self.Bind(wx.EVT_BUTTON, self.OnAnotherTab, id=ID_ANOTHERRATE[Bezeichnung])
"""
self.Bind(wx.EVT_BUTTON, self.OnAnotherTab(self, bez=Bezeichnung,rows=Rows,cols=Cols,header=Header), id=ID_ANOTHERRATE[Bezeichnung])
Das hier ist mein größtes Problem!
Ich möchte hier die Methode self.OnAnotherTab aufrufen, da diese jedoch nur für den hier instanzierten
Kennwert aufgerufen werden soll, muss ich zumindest die 'Bezeichnung' übergeben!
Funktioniert aber scheinbar so nicht!!! Was muss ich ändern?
"""
self.TabSizer[TabellenKennung].Add(self.Label[TabellenKennung], 2, border=1, flag=0)
self.TabSizer[TabellenKennung].Add(self.Eingabe[TabellenKennung], 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.TabSizer[TabellenKennung], 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.AnotherRate[Bezeichnung], 2, border=1, flag=0)
self.MainSizer.Add(self.PartSizer[Bezeichnung], 2, border=1, flag=0)
ID_SCHNELLEINGABEWRITE=wx.NewId()
self.Write = wx.Button(id=ID_SCHNELLEINGABEWRITE, label='Write *.inp-file',
name='Write', parent=self, pos=wx.Point(8, 680), size=wx.Size(720,
48), style=0)
self.Write.Bind(wx.EVT_BUTTON, self.OnWriteButton, id=ID_SCHNELLEINGABEWRITE)
self.textEditor = wx.stc.StyledTextCtrl(id=-1,
name='styledTextCtrl1', parent=self, pos=wx.Point(8,750),
size=wx.Size(720, 100), style=0)
self.textEditor.SetScrollWidth(680)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.MainSizer, 0, border=5, flag=0)
vbox.Add(self.Write, 0, border=5, flag=0)
vbox.Add(self.textEditor, 0, border=5, flag=0)
Schnelleingabe.SetSizer(self, vbox )
Schnelleingabe.SetAutoLayout(self, 1)
self.SetupScrolling()
def OnWriteButton(self, event):
"""
Die Methode funktioniert, daher habe ich siehier weggelassen!
"""
event.skip()
def OnAnotherTab(self, evt):
"""
Diese Methode soll durch drücken des Buttons (ID_ANOTHERRATE[Bezeichnung]) eine weitere Tabelle
anhängen!
Zur Zeit wird diese noch unter den Button angehängt (wenn es funktionieren würde), später soll sie
über ein Auswahlfenster mit 'insert' beliebig zwischen den Tabellen von 'Bezeichnung' eingefügt werden können.
"""
Bezeichnung='Tabellentest_a'
"""
Da es mit der Übergabe der Bezeichnung nicht funktioniert habe ich hier erstmal
die Bezeichnung neu definiert. Da es Tabellentest_a gibt, hatte ich gehofft,
das es damit klappt.
Es kommt aber folgende Fehlermeldung :
Traceback (most recent call last):
File "D:\Panel.py", line 281, in OnAnotherTab
self.PartSizer[Bezeichnung].Add(self.TabSizer[TabellenKennung], 2, border=1, flag=0)
File "C:\Python23\Lib\site-packages\wx-2.5.4-msw-ansi\wx\_core.py", line 11263, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the BoxSizer object has been deleted, attribute access no longer allowed.
Es gibt den Eintrag self.PartSizer['Tabellentest_a'] noch! Wo ist mein Fehler???
"""
self.TabellenIndex[Bezeichnung]+=1
TabellenKennung=Bezeichnung+str(self.TabellenIndex[Bezeichnung])
self.TabSizer[TabellenKennung] = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
self.Eingabe[TabellenKennung] = wx.grid.Grid(id=-1, name=Bezeichnung,
parent=self, style=wx.STATIC_BORDER | wx.TAB_TRAVERSAL)
self.Eingabe[TabellenKennung].CreateGrid(7,5)
for col in xrange(0,5):
for row in xrange(0,7):
self.Eingabe[TabellenKennung].SetCellEditor(row, col, wx.grid.GridCellFloatEditor(8,4))
self.Eingabe[TabellenKennung].SetCellValue(row,col,'%s'%self.TabellenIndex[Bezeichnung])
self.Label[TabellenKennung]=wx.StaticText(id=-1,label=Bezeichnung+' %s daddel Function'%self.TabellenIndex[Bezeichnung],
name='Label'+Bezeichnung,
parent=self, size=wx.Size(108, 13), style=0)
self.TabSizer[TabellenKennung].Add(self.Label[TabellenKennung], 2, border=1, flag=0)
self.TabSizer[TabellenKennung].Add(self.Eingabe[TabellenKennung], 2, border=1, flag=0)
self.PartSizer[Bezeichnung].Add(self.TabSizer[TabellenKennung], 2, border=1, flag=0)
Viele Grüße aus dem hohen Norden!
Jens