Sizer im Dict, Parameterübergabe an Methode

Plattformunabhängige GUIs mit wxWidgets.
Antworten
JensP-Anfaenger
User
Beiträge: 23
Registriert: Montag 25. April 2005, 08:31
Wohnort: Schleswig-Holstein

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?

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)

Schon im Vorraus ein Dankeschön für eure Hilfe!

Viele Grüße aus dem hohen Norden!

Jens
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Jens,

tut mir leid: Niemand antwortet und ich steige ehrlich gesagt nicht durch. Mein Vorschlag:
- Mache aus den überflüssigen Doc-Strings echte Kommentare
- übersetzte alles auf Englisch
- Schreibe etwas klarer welche Methode Du meinst
- und schließlich schicke das Ganze als Frage an die wxPython user mailing list. Da wirst Du mit Sicherheit Antwort erhalten.

Zum Schluß nochmal geraten: Ich könnte mir vorstellen, daß sich der BoxSizer so nicht mit dem FlexGridSizer verträgt.

Gruß zurück von Süd nach Nord,
Christian
JensP-Anfaenger
User
Beiträge: 23
Registriert: Montag 25. April 2005, 08:31
Wohnort: Schleswig-Holstein

Hallo,

vielen Dank für deine Antwort!

Muss ich einfach eine Mail an wxpython-users@lists.wxwidgets.org

schreiben???

Gruß!

Jens

(Langsam wird es auch hier Sommer, schon fast 20°C!!! :wink: )
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ja, genau - wobei es ganz nützlich wäre, wenn Du Dich auch auf der Subscriberliste einträgst. Oder Du sagst explizit, daß man Dir direkt antworten soll.

Gruß,
Christian
JensP-Anfaenger
User
Beiträge: 23
Registriert: Montag 25. April 2005, 08:31
Wohnort: Schleswig-Holstein

Hallo,

danke für den Tip mit der Mail-List!

ich bin meinem Ziel wieder ein ganzes Stück weiter gekommen!

Ich werde meinen Code, wenn er dann letztlich auch funktioniert, hier mal wieder posten!

Gruß

Jens

Heute schon über 20°C :arrow: Für uns schon Hochsommer :wink:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Jens,

schön das es geklappt hat. Ich bin heute erst dazu gekommen mal meine wxPython Mails zu lesen.

Nun, im Übrigen finde ich, daß es an der Zeit ist das "Anfänger" aus Deinem Nick zu streichen.

Gruß,
Christian
JensP-Anfaenger
User
Beiträge: 23
Registriert: Montag 25. April 2005, 08:31
Wohnort: Schleswig-Holstein

Hallo CM,

wahrscheinlich hast du recht, ich fange mittlerweile auch schon fast an, Fragen anderer User beantworten zu können!!!

Muss ich mich neu unter anderem Namen anmelden oder kann ich meinen Nick auch so ändern?

Gruß,

Jens
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JensP-Anfaenger hat geschrieben:Muss ich mich neu unter anderem Namen anmelden oder kann ich meinen Nick auch so ändern?
Nein, also den Nick selbst ändern geht in diesem Forum nicht, aber du könntest mal piddon fragen, ob es das machen könnte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten