Hello everybody!
My name is Jens Petersen and I am a student in mechanical engineering in
Flensburg (in the very north of germany!)
So at first: Sorry for my english, I hope you will understand!
At the moment, I am writing my diploma-thesis and a part of it is to be
programmed in python!
But there are some problems if you dont know anybody who knows python very
well, so I hope you can help me!
I have two problems at the moment!
1.: I cant insert my fields into the sizers!
2.: I need to give some values to a method, but I dont know how!
Please look at the code, my doc-strings explain my problems!
[python]
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='PanelName',
parent=parent, size=(700,500))
"""
This Panel should be as variabel as possible. For the different
types of
parameters there are different ways to init them:
Numbers:
('ParameterName','Num','Group',Value,Minimum,Maximun,Limited,Precision(ints
after dot),ints before dot,'Unit')
Group means, that parameters of one group are shown side by side,
not as usually one below the other
Strings: ('ParameterName','Str')
Spacer: ('ParameterName','Spa') - ParameterName may be '', is not
used
Combobox: ('ParameterName','Com',Value,[Auswahlmöglichkeiten])
Dates: ('ParameterName','Dat')
Tables: ('ParameterName','Tab',Design,Rows,Columns,Columntitles)
Design is for later! Still unused
"""
ListParameter=[
('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','',['','','']),
('Tabletest_a','Tab',5,7,3,[(0,"header1"),(1,"header2"),(2,"header3"),(3,'header4')]),
('Tabletest_b','Tab',5,7,3,[(0,"header1_b"),(1,"header2_b"),(2,"header3_b"),(3,'header4_b')]),
]
"""
You see, that 'number 1' and 'number 2' are in the same group, so
they schould be shown side by side
"""
self.EnteredParameter={}
"""Dict to keep the Parameters catchable"""
self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=-1, vgap=0)
self.PartSizer={}
self.GroupSizer={}
"""Dicts zo save the Sizer of Parameters and Groups"""
self.TabIndex={}
"""
Saves, how many Tables e.g. for 'Tabletest_a' exist, every
Table-Parameter may have several tables!
"""
for Parameters in ListParameter:
ParameterName=Parameters[0]
Art=Parameters[1]
if Art=='Num':
Group=Parameters[2]
Wert=Parameters[3]
Min=Parameters[4]
Max=Parameters[5]
Limited=Parameters[6]
Precicion=Parameters[7]
IntegerWidth=Parameters[8]
Unit=Parameters[9]
self.EnterBox=wx.lib.masked.numctrl.NumCtrl(id = -1,
name=ParameterName, 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=ParameterName+' '+Unit, name='Label'+ParameterName,
parent=self, size=wx.Size(108, 13), style=0)
self.EnteredParameter[ParameterName]=self.EnterBox
if Group==None:
"""
If this parameter has no group, it is shown under the
other
paramerts, the parameter-label is shown on the left side
of
the control-box
"""
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[ParameterName].Add(self.Label, 2,
border=1, flag=0)
self.PartSizer[ParameterName].Add(self.EnterBox, 2,
border=1, flag=0)
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
else:
"""
if a group is given, the Label is schown above the
control-box, and the parameter is placed side by side
other
parameters of the same group
"""
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.VERTICAL)
self.PartSizer[ParameterName].Add(self.Label, 2,
border=1, flag=0)
self.PartSizer[ParameterName].Add(self.EnterBox, 2,
border=1, flag=0)
self.GroupSizer[Group] =
wx.BoxSizer(orient=wx.HORIZONTAL)
self.GroupSizer[Group].Add(self.PartSizer[ParameterName], 2, border=1,
flag=0)
self.GroupSizer[Group].Layout()
self.MainSizer.Add(self.GroupSizer[Group], 2, border=1,
flag=0)
elif Art=='Str':
self.EnterBox=wx.TextCtrl(id=-1, name=ParameterName,
parent=self, size=wx.Size(100, 21),
style=0, value='please enter')
self.Label=wx.StaticText(id=-1,
label=ParameterName, name='Label'+ParameterName,
parent=self, size=wx.Size(108, 13), style=0)
self.EnteredParameter[ParameterName]=self.EnterBox
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[ParameterName].Add(self.Label, 2, border=1,
flag=0)
self.PartSizer[ParameterName].Add(self.EnterBox, 2,
border=1, flag=0)
self.PartSizer[ParameterName].Layout()
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
elif Art=='Spa':
self.PartSizer[ParameterName] =(20,20)
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
elif Art=='Dat':
self.EnterBox=wx.DatePickerCtrl(self, size=(100,-1),
style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
self.Label=wx.StaticText(id=-1,
label=ParameterName, name='Label'+ParameterName,
parent=self, size=wx.Size(108, 13), style=0)
self.EnteredParameter[ParameterName]=self.EnterBox
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[ParameterName].Add(self.Label, 2, border=1,
flag=0)
self.PartSizer[ParameterName].Add(self.EnterBox, 2,
border=1, flag=0)
self.PartSizer[ParameterName].Layout()
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
elif Art=='Com':
Wert=Parameters[2]
Auswahl=Parameters[3]
self.EnterBox=wx.ComboBox(choices=Auswahl,
id=-1, name=ParameterName, parent=self,
size=wx.Size(35, 21), style=0, value=Wert)
self.Label=wx.StaticText(id=-1,
label=ParameterName, name='Label'+ParameterName,
parent=self, size=wx.Size(108, 13), style=0)
self.EnteredParameter[ParameterName]=self.EnterBox
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.HORIZONTAL)
self.PartSizer[ParameterName].Add(self.Label, 2, border=1,
flag=0)
self.PartSizer[ParameterName].Add(self.EnterBox, 2,
border=1, flag=0)
self.PartSizer[ParameterName].Layout()
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
elif Art=='Tab':
self.TabIndex[ParameterName]=1
self.TabSizer={}
ID_ANOTHERRATE={}
self.AnotherRate={}
TableName=ParameterName+str(self.TabIndex[ParameterName])
self.PartSizer[ParameterName] =
wx.BoxSizer(orient=wx.VERTICAL)
self.TabSizer[TableName] = wx.FlexGridSizer(cols=2, hgap=0,
rows=1, vgap=0)
Design=Parameters[2]
Rows=Parameters[3]
Cols=Parameters[4]
Header=Parameters[5]
self.EnterBox={}
self.Label={}
self.EnterBox[TableName] = wx.grid.Grid(id=-1,
name=ParameterName,
parent=self, style=wx.STATIC_BORDER | wx.TAB_TRAVERSAL)
self.EnterBox[TableName].CreateGrid(Rows,Cols)
for col in xrange(0,Cols):
for row in xrange(0,Rows):
self.EnterBox[TableName].SetCellEditor(row, col,
wx.grid.GridCellFloatEditor(8,4))
self.EnterBox[TableName].SetCellValue(row,col,'%s'%self.TabIndex[ParameterName])
for col, header in Header:
self.EnterBox[TableName].SetColLabelValue(col,header)
self.Label[TableName]=wx.StaticText(id=-1,
label=ParameterName+' %s instanzierung'%self.TabIndex[ParameterName],
name='Label'+ParameterName, parent=self,
size=wx.Size(158, 13),style=0)
ID_ANOTHERRATE[ParameterName]=wx.NewId()
self.AnotherRate[ParameterName] =
wx.Button(id=ID_ANOTHERRATE[ParameterName],
label='Another Rate?', name='ANOTHERRATE', parent=self,
size=wx.Size(75, 23), style=0)
self.Bind(wx.EVT_BUTTON, self.OnAnotherTab,
id=ID_ANOTHERRATE[ParameterName])
"""
This here is my biggest problem!!!
From here I'd like to call the method 'self.OnAnotherTab',
but I need the value of 'ParameterName' in the method!
Why doesn't it work this way:
self.Bind(wx.EVT_BUTTON, self.OnAnotherTab(self,
bez=ParameterName), id=ID_ANOTHERRATE[ParameterName])
"""
self.TabSizer[TableName].Add(self.Label[TableName], 2,
border=1, flag=0)
self.TabSizer[TableName].Add(self.EnterBox[TableName], 2,
border=1, flag=0)
self.PartSizer[ParameterName].Add(self.TabSizer[TableName],
2, border=1, flag=0)
self.PartSizer[ParameterName].Add(self.AnotherRate[ParameterName], 2,
border=1, flag=0)
self.MainSizer.Add(self.PartSizer[ParameterName], 2,
border=1, flag=0)
ID_SCHNELLEINGABEWRITE=wx.NewId()
self.Write = wx.Button(id=ID_SCHNELLEINGABEWRITE, label='Write
*.xyz-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):
"""
This method works, that's why I don't show it here!
"""
event.skip()
def OnAnotherTab(self, evt):
"""
This method should create another table for the 'ParameterName' by
clicking on the button 'Another rate?'.
Later this table should be inserted between the table before and the
button!
But because it dosen't work yet, I just try to add it after the
button...
"""
ParameterName='Tabletest_a'
"""
Because of the problem, that I can't give the 'ParameterName' to
this
method, I try to use 'Tabletest_a'!
But this error-massage is shown:
Traceback (most recent call last):
File "D:\Panel.py", line 281, in OnAnotherTab
self.PartSizer[ParameterName].Add(self.TabSizer[TableName], 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.
self.PartSizer['Tabletest_a'] is existing! Where is my mistake???
"""
self.TabIndex[ParameterName]+=1
TableName=ParameterName+str(self.TabIndex[ParameterName])
self.TabSizer[TableName] = wx.FlexGridSizer(cols=2, hgap=0, rows=1,
vgap=0)
self.EnterBox[TableName] = wx.grid.Grid(id=-1, name=ParameterName,
parent=self, style=wx.STATIC_BORDER | wx.TAB_TRAVERSAL)
self.EnterBox[TableName].CreateGrid(7,5)
for col in xrange(0,5):
for row in xrange(0,7):
self.EnterBox[TableName].SetCellEditor(row, col,
wx.grid.GridCellFloatEditor(8,4))
self.EnterBox[TableName].SetCellValue(row,col,'%s'%self.TabIndex[ParameterName])
self.Label[TableName]=wx.StaticText(id=-1,label=ParameterName+' %s
daddel Function'%self.TabIndex[ParameterName],
name='Label'+ParameterName,
parent=self, size=wx.Size(108, 13), style=0)
self.TabSizer[TableName].Add(self.Label[TableName], 2, border=1,
flag=0)
self.TabSizer[TableName].Add(self.EnterBox[TableName], 2, border=1,
flag=0)
self.PartSizer[ParameterName].Add(self.TabSizer[TableName], 2,
border=1, flag=0)
[\python]
It would be very nice, if anybody could help me!
Thank you!
Please ask me, if you dont know, what I mean!
···
--
Jens Petersen
Berliner Str. 96
25746 Heide
Weitersagen: GMX DSL-Flatrates mit Tempo-Garantie!
Ab 4,99 Euro/Monat: http://www.gmx.net/de/go/dsl