import wx import wx.stc import math import wx.lib.scrolledpanel as scrolled import wx.lib.masked.numctrl from wx.lib.anchors import LayoutAnchors import wx.grid import pickle 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,[Choices]) 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) #---------------------------------------------------------------------- class WorkingArea(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent=parent vbox = wx.BoxSizer(wx.VERTICAL) desc = wx.StaticText(self, -1, "Testtext \n" "Blablabla" ) desc.SetForegroundColour("Blue") vbox.Add(desc, 0, wx.ALIGN_LEFT|wx.ALL, 5) vbox.Add(wx.StaticLine(self, -1, size=(700,-1)), 0, wx.ALL, 5) vbox.Add((20,20)) self.panel1=Schnelleingabe(self) self.FLexGrid1 = wx.FlexGridSizer(cols=1, vgap=4, hgap=4) self.panel1.SetSizer( self.FLexGrid1 ) hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add((20,20)) hbox.Add(self.panel1, 0, wx.FIXED_MINSIZE) hbox.Add((40, 10)) vbox.Add(hbox, 0) self.SetSizer(vbox) #---------------------------------------------------------------------- class MainWindow(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, 'MainWindow' , pos=(50,50), style=wx.DEFAULT_FRAME_STYLE|wx.MAXIMIZE) self.CreateStatusBar() menuBar = wx.MenuBar() menu = wx.Menu() menu.Append(8998, "&Exit\tAlt-X", "Exit demo") menu.Append(8999, "&Save\tCtrl-s", "Save") menu.Append(8997, '&Write *.zyx\tCtrl+I',"Save material-set") menu.Append(8996, '&MainMenu\tCtrl+B',"back to main-menu") self.Bind(wx.EVT_MENU, self.OnExitApp, id=8998) self.Bind(wx.EVT_MENU, self.OnSaveApp, id=8999) self.Bind(wx.EVT_MENU, self.OnWriteINP, id=8997) self.Bind(wx.EVT_MENU, self.OnMainMenu, id=8996) menuBar.Append(menu, "&File") self.SetMenuBar(menuBar) self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) MainWindow.window = WorkingArea(self) def OnExitApp(self, evt): MainWindow.Close(self) def OnCloseFrame(self, evt): evt.Skip() def OnSaveApp(self, evt): dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.xyz", wx.SAVE|wx.OVERWRITE_PROMPT) try: if dlg.ShowModal() == wx.ID_OK: filename = dlg.GetPath() a={} a['Tables']=len(self.window.tablestore) for z in xrange(0,len(self.window.tablestore)): for x in xrange(0,self.window.tablestore[z-1].i): for y in xrange(0,self.window.tablestore[z-1].j): a['text',z,x,y]=self.window.tablestore[z-1].tabelle.GetCellValue(x,y) f=open(filename, "w") f.write('Test') f.write("\n") f.write(filename) f.write("\n\n") pickle.dump(a,f) f.close() self.FileName=filename self.SetTitle(('MatProg xyz123 - %s') % filename) finally: dlg.Destroy() def OnWriteINP(self, evt): evt.Skip() """ Still in development: def OnOpenApp(self, evt): dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.xyz", wx.SAVE|wx.OVERWRITE_PROMPT) try: if dlg.ShowModal() == wx.ID_OK: filename = dlg.GetPath() a={} a['Tables']=len(self.window.tablestore) for z in xrange(0,len(self.window.tablestore)): for x in xrange(0,self.window.tablestore[z-1].i): for y in xrange(0,self.window.tablestore[z-1].j): self.window.tablestore[z-1].tabelle.SetCellValue(a['text',z,x,y],x,y) print a['text',z,x,y] f=open(filename, "w") f.write('Test') f.write("\n") f.write(filename) f.write("\n\n") pickle.dump(a,f) f.close() self.FileName=filename #self.SetTitle(('MatProg xyz123 - %s') % filename) finally: dlg.Destroy() """ def OnMainMenu(self,evt): self.window.Show(False) self.window = WorkingArea(self) self.window.Show(True) frame=MainWindow() frame.Show(True) MyApp.SetTopWindow(frame) #---------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame=MainWindow() frame.Show(True) self.SetTopWindow(frame) return True #---------------------------------------------------------------------- def main(): app = MyApp() app.MainLoop() if __name__ == '__main__': main()