Datenabfrage, Sizer, Application

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

Hallo,

ich hoffe es ist hier wieder jemand so freundlich und hilft mir!!!

Ich habe bisher folgenden Code geschrieben bzw. kopiert:

1. Applikation mit dem Namen 'run.py':

Code: Alles auswählen

import wx                 
import sys, os

assertMode = wx.PYAPP_ASSERT_EXCEPTION


#----------------------------------------------------------------------------

class Log:
    def WriteText(self, text):
        if text[-1:] == '\n':
            text = text[:-1]
        wx.LogMessage(text)
    write = WriteText


class RunDemoApp(wx.App):
    def __init__(self, name, module, useShell):
        self.name = name
        self.demoModule = module
        self.useShell = useShell
        wx.App.__init__(self, redirect=False)


    def OnInit(self):
        wx.Log_SetActiveTarget(wx.LogStderr())

        self.SetAssertMode(assertMode)

        frame = wx.Frame(None, -1, "RunDemo: " + self.name, pos=(50,50),
                                  size=(800,600), style=wx.DEFAULT_FRAME_STYLE)
        frame.CreateStatusBar()

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        item = menu.Append(-1, "E&xit\tAlt-X", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, item)
        menuBar.Append(menu, "&File")

        ns = {}
        ns['wx'] = wx
        ns['app'] = self
        ns['module'] = self.demoModule
        ns['frame'] = frame
        
        frame.SetMenuBar(menuBar)
        frame.Show(True)
        frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)

        win = self.demoModule.runTest(frame, frame, Log())

        # a window will be returned if the demo does not create
        # its own top-level window
        if win:
            # so set the frame to a good size for showing stuff
            frame.SetSize((640, 480))
            win.SetFocus()
            self.window = win
            ns['win'] = win
            frect = frame.GetRect()

        else:
            # It was probably a dialog or something that is already
            # gone, so we're done.
            frame.Destroy()
            return True

        self.SetTopWindow(frame)
        self.frame = frame
        #wx.Log_SetActiveTarget(wx.LogStderr())
        #wx.Log_SetTraceMask(wx.TraceMessages)

        if self.useShell:
            # Make a PyShell window, and position it below our test window
            from wx import py
            shell = py.shell.ShellFrame(None, locals=ns)
            frect.OffsetXY(0, frect.height)
            frect.height = 400
            shell.SetRect(frect)
            shell.Show()

            # Hook the close event of the test window so that we close
            # the shell at the same time
            def CloseShell(evt):
                if shell:
                    shell.Close()
                evt.Skip()
            frame.Bind(wx.EVT_CLOSE, CloseShell)
                    
        return True


    def OnExitApp(self, evt):
        self.frame.Close(True)


    def OnCloseFrame(self, evt):
        if hasattr(self, "window") and hasattr(self.window, "ShutdownDemo"):
            self.window.ShutdownDemo()
        evt.Skip()


#----------------------------------------------------------------------------


def main(argv):
    useShell = False
    for x in range(len(sys.argv)):
        if sys.argv[x] in ['--shell', '-shell', '-s']:
            useShell = True
            print sys.argv[x]
            del sys.argv[x]
            break
            
    if len(argv) < 2:
        print "Please specify a demo module name on the command-line"
        raise SystemExit

    name, ext  = os.path.splitext(argv[1])
    module = __import__(name)


    app = RunDemoApp(name, module, useShell)
    app.MainLoop()



if __name__ == "__main__":
    main(sys.argv)
2. Das eigentliche Programm 'FrameMitScrolledPanel.py'

Code: Alles auswählen

import  wx
import  wx.lib.scrolledpanel as scrolled
import  wx.grid

#----------------------------------------------------------------------

class PanelTabelle(wx.Panel):
  
    def __init__(self, parent, id, size, style, name, sizer,i,j):
        self.i=i
        self.j=j
        self.parent=parent
        self.name=name
        if self.name=='test_0':
            self.name='quasi-static'
        self.gridname=sizer
        #print self.gridname
        self.id=id
        
        wx.Panel.__init__(self, id=-1, name=self.name,
              parent=self.parent, size=wx.Size(532, 290),
              style=wx.TAB_TRAVERSAL)
        self.SetClientSize(wx.Size(524, 256))
    
        self.Rate = wx.StaticText(id=-1, label='Rate'+' '+self.name,
              name='Rate', parent=self, size=wx.Size(190,
              20), style=0)
        self.Rate.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Microsoft Sans Serif'))
    
        self.rate = wx.TextCtrl(id=-1, name='rate',
              parent=self, size=wx.Size(100, 21), style=0,
              value='')
    
        self.staticText2 = wx.StaticText(id=-1,
              label='s^-1', name='staticText2', parent=self, 
              size=wx.Size(20, 13), style=0)
    
        self.TEMPDEP = wx.CheckBox(id=-1,
              label='temperature dependent?', name='TEMPDEP', parent=self,
              size=wx.Size(200, 13), style=0)
        self.TEMPDEP.SetValue(False)
    
        self.gridname = wx.grid.Grid(id=self.id, name=self.name,
              parent=self, size=wx.Size(500, 100),
              style=wx.CAPTION | wx.MINIMIZE_BOX)
        
        
        self.CALCULATE = wx.Button(id=-1,
              label='Calculate', name='CALCULATE', parent=self, 
              size=wx.Size(75, 23), style=0)
    
        self.ANOTHERRATE = wx.Button(id=-1,
              label='Another rate?', name='ANOTHERRATE', parent=self,
              size=wx.Size(75, 23), style=0)
    
        self.NOMST = wx.RadioButton(id=-1,
              label='nominal strain / stress', name='NOMST', parent=self,
              size=wx.Size(150, 13), style=0)
        self.NOMST.SetValue(False)
    
        self.TRUST = wx.RadioButton(id=-1,
              label='total logarithmic strain / true stress', name='TRUST',
              parent=self, size=wx.Size(200, 13),
              style=0)
        self.TRUST.SetValue(False)
    
        self.boxSizer1 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer1.Add(self.Rate, 
            flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
            border=10)
        self.boxSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.rate, flag=wx.ALIGN_RIGHT | 
            wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.staticText2, flag=wx.ALIGN_RIGHT | 
            wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
    
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer2.Add(self.CALCULATE, 0, border=2, flag=0)
        self.boxSizer2.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer2.Add(self.ANOTHERRATE, 0, border=2, flag=0)
        self.boxSizer2.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        
        self.boxSizer3 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3.Add(self.NOMST, 0, border=0, flag=0)
        self.boxSizer3.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer3.Add(self.TRUST, 0, border=0, flag=0)
    
        self.flexGridSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer1, 2, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.TEMPDEP, 0, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer3, 0, border=0, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.gridname, 0, border=10, flag=0)
        
        self.flexGridSizer1.Add(self.boxSizer2, 0, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        
        self.a={}
        
        PanelTabelle.SetSizer(self, self.flexGridSizer1 )
        PanelTabelle.SetAutoLayout(self, 1)
        
        self.gridname.CreateGrid(self.i,self.j)
        for x in xrange(0,self.i):
            for y in xrange(0,self.j):
                self.a[self.name,x,y]=self.gridname.GetCellValue(x,y)
        for x in xrange(0,self.i):
            for y in xrange(0,self.j):
                self.a[self.name,x,y]=self.gridname.GetCellValue(x,y)
        
       

text = "0 1 100 200"

class TestPanel(scrolled.ScrolledPanel):
    def __init__(self, parent, log):
        self.log = log
        self.i=5
        self.j=7
        scrolled.ScrolledPanel.__init__(self, parent, -1)

        vbox = wx.BoxSizer(wx.VERTICAL)
        desc = wx.StaticText(self, -1,
                            "Testtext"
                            )
        desc.SetForegroundColour("Blue")
        vbox.Add(desc, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        vbox.Add(wx.StaticLine(self, -1, size=(900,-1)), 0, wx.ALL, 5)
        vbox.Add((20,20))

        words = text.split()

        panel1 = scrolled.ScrolledPanel(self, -1, size=(800, 600),
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER,
                                 name="panel1" )
        fgs1 = wx.FlexGridSizer(cols=2, vgap=4, hgap=4)
        
        PanelID=6000
        a={}
        i=1
                
        for word in words:
            label = wx.StaticText(panel1, -1, "Rate"+word+":")

            tc = wx.TextCtrl(panel1, -1, word, size=(50,-1))
            
            test="test_%s"%(word)
                     
            tab=PanelTabelle(parent=panel1, id=PanelID,
                size=wx.Size(500, 323), style=0, name=test, 
                sizer=test,i=self.i,j=self.j)
            
            ident=PanelID+1
                        
            PanelID+=2
            i+=1
            
            fgs1.Add(label, flag=wx.ALIGN_RIGHT | 
                wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
            fgs1.Add(tc, flag=wx.RIGHT, border=10)
            fgs1.AddSpacer(wx.Size(30, 30), border=4, flag=0)
            fgs1.Add(tab)
            for x in xrange (0,self.i):
                for y in xrange (0,self.j):
                    tab.gridname.SetCellValue(x,y,"%s(%s,%s)"%(word,x,y))
        
        panel1.SetSizer( fgs1 )
        panel1.SetAutoLayout(1)
        panel1.SetupScrolling()

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((20,20))
        hbox.Add(panel1, 0, wx.FIXED_MINSIZE)
        hbox.Add((40, 10))

        vbox.Add(hbox, 0)
        self.SetSizer(vbox)
        self.SetAutoLayout(1)
        self.SetupScrolling()


#----------------------------------------------------------------------


def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

#----------------------------------------------------------------------



if __name__ == '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

Nun meine Fragen:
1. Ich weiß nicht, wie ich auf den Inhalt von den Tabellen zugreifen
kann! Wie kann ich auf den Inhalt von z.B. der obersten Tabelle
zweite Spalte, zweite Reihe zugreifen?
Jede Tabelle hat eine bekannt ID! Hilft das?

2. Diese Datei 'run.py' habe ich kopiert! Was brauche ich daraus?
Mir würde es genügen, wenn mir jemand sagt, was zu tun ist,
damit ich die 'FrameMitScrolledPanel.py' von einem anderen
Framea us starten könnte.

3. Um nicht die Tabelleanzahl über die word in words (Anzahl der
Wörter o.ä.) zu steuern, sondern über den Button 'Another rate?'
müsste ich doch nur eine Methode erstellen, die die Klasse
'PanelTabelle' nochmal initialisiert und sie dann dem Sizer in
dem Scrolled Panel übergibt? Oder???

Vielen Dank für eure Hilfe!!!

Gruß

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

Hoi Jens,
Jens hat geschrieben:1. Ich weiß nicht, wie ich auf den Inhalt von den Tabellen zugreifen
kann! Wie kann ich auf den Inhalt von z.B. der obersten Tabelle
zweite Spalte, zweite Reihe zugreifen?
Jede Tabelle hat eine bekannt ID! Hilft das?
Ich würde das genauso machen wie in dem TextCtrl-Beispiel aus dem letzten Thread: Nehme die Tabellen in eine Liste auf (z. B. tabs). Allerdings müßte diese Liste zur Hauptklasse gehören (also self.tabs)!
Aber: Willst Du wirklich eine Tabelle? Mir schien irgendwie beim letzten Mal, daß Du ein Grid wolltest.
Jens hat geschrieben:2. Diese Datei 'run.py' habe ich kopiert! Was brauche ich daraus?
Mir würde es genügen, wenn mir jemand sagt, was zu tun ist,
damit ich die 'FrameMitScrolledPanel.py' von einem anderen
Framea us starten könnte.
Du brauchst run.py nicht! Diese Datei gibt es bloß in den Beispielen, um eine homogene Umgebung zu machen ohne, daß diejenigen, die die Beispiele zusammengefasst haben, immer wieder alles neu schreiben mußten.
Schau auch hier noch mal in mein Beispiel vom letzten Thread: Dort gibt es eine Klasse "EnterApp", die alles regelt. Die Klasse, die dann aber initialisiert wird, sollte von wxFrame ableiten: Das macht Dir das Leben mit den Sizern auch etwas einfacher.
Jens hat geschrieben:3. Um nicht die Tabelleanzahl über die word in words (Anzahl der
Wörter o.ä.) zu steuern, sondern über den Button 'Another rate?'
müsste ich doch nur eine Methode erstellen, die die Klasse
'PanelTabelle' nochmal initialisiert und sie dann dem Sizer in
dem Scrolled Panel übergibt? Oder???
Jein. Du könntest Dich auch hier an den letzten Thread anlehnen. Achte aber darauf, daß Du nicht etwa mal den Mainframe neu initialisierst.

Im Übrigen würde ich an Deiner Stelle den Aufbau des Fensters insgesamt wasserdicht machen, indem ich alles in Sizer einbinde. Ansonsten kannst Du unliebsame Überraschungen erleben, ganz besonders dann, wenn Deine Anwedung mal auf einem anderen Recher laufen soll.
Außerdem bekomme ich AddSpacer eine DeprecationWarning! Du nicht auch? Welche wxPython-Version verwendest Du?

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

Hallo,

gut, dass bei dir wieder alles läuft!

Ersteinmal danke für die schnelle Antwort!

Das mit dem 'run.py'-File hat sich erledigt!

Mit Try'n'Error konnte ich das ganze erstmal auf die eine Datei kürzen:

Code: Alles auswählen


import  wx
import  wx.lib.scrolledpanel as scrolled
import  wx.grid

#----------------------------------------------------------------------

class PanelTabelle(wx.Panel):
  
    def __init__(self, parent, id, size, style, name, sizer,i,j):
        self.i=i
        self.j=j
        self.parent=parent
        self.name=name
        if self.name=='test_0':
            self.name='quasi-static'
        self.gridname=sizer
        #print self.gridname
        self.id=id
        
        wx.Panel.__init__(self, id=-1, name=self.name,
              parent=self.parent, size=wx.Size(532, 290),
              style=wx.TAB_TRAVERSAL)
        self.SetClientSize(wx.Size(524, 256))
    
        self.Rate = wx.StaticText(id=-1, label='Rate'+' '+self.name,
              name='Rate', parent=self, size=wx.Size(190,
              20), style=0)
        self.Rate.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Microsoft Sans Serif'))
    
        self.rate = wx.TextCtrl(id=-1, name='rate',
              parent=self, size=wx.Size(100, 21), style=0,
              value='')
    
        self.staticText2 = wx.StaticText(id=-1,
              label='s^-1', name='staticText2', parent=self, size=wx.Size(20, 13), style=0)
    
        self.TEMPDEP = wx.CheckBox(id=-1,
              label='temperature dependent?', name='TEMPDEP', parent=self,
              size=wx.Size(200, 13), style=0)
        self.TEMPDEP.SetValue(False)
    
        self.gridname = wx.grid.Grid(id=self.id, name=self.name,
              parent=self, size=wx.Size(500, 100),
              style=wx.CAPTION | wx.MINIMIZE_BOX)
        
        
        self.CALCULATE = wx.Button(id=-1,
              label='Calculate', name='CALCULATE', parent=self, size=wx.Size(75, 23), style=0)
    
        self.ANOTHERRATE = wx.Button(id=-1,
              label='Another rate?', name='ANOTHERRATE', parent=self,
              size=wx.Size(75, 23), style=0)
    
        self.NOMST = wx.RadioButton(id=-1,
              label='nominal strain / stress', name='NOMST', parent=self,
              size=wx.Size(150, 13), style=0)
        self.NOMST.SetValue(False)
    
        self.TRUST = wx.RadioButton(id=-1,
              label='total logarithmic strain / true stress', name='TRUST',
              parent=self, size=wx.Size(200, 13),
              style=0)
        self.TRUST.SetValue(False)
    
        self.boxSizer1 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer1.Add(self.Rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.staticText2, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
    
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer2.Add(self.CALCULATE, 0, border=2, flag=0)
        self.boxSizer2.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer2.Add(self.ANOTHERRATE, 0, border=2, flag=0)
        self.boxSizer2.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        
        self.boxSizer3 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3.Add(self.NOMST, 0, border=0, flag=0)
        self.boxSizer3.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.boxSizer3.Add(self.TRUST, 0, border=0, flag=0)
    
        self.flexGridSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer1, 2, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.TEMPDEP, 0, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer3, 0, border=0, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.gridname, 0, border=10, flag=0)
        
        self.flexGridSizer1.Add(self.boxSizer2, 0, border=10, flag=0)
        self.flexGridSizer1.AddSpacer(wx.Size(15, 15), border=0, flag=0)
        
        self.a={}
        
        PanelTabelle.SetSizer(self, self.flexGridSizer1 )
        PanelTabelle.SetAutoLayout(self, 1)
        
        self.gridname.CreateGrid(self.i,self.j)
        for x in xrange(0,self.i):
            for y in xrange(0,self.j):
                self.a[self.name,x,y]=self.gridname.GetCellValue(x,y)
        for x in xrange(0,self.i):
            for y in xrange(0,self.j):
                self.a[self.name,x,y]=self.gridname.GetCellValue(x,y)
 

#----------------------------------------------------------------------       
       

text = "0 1 100 200"

class TestPanel(scrolled.ScrolledPanel):
    def __init__(self, parent):
        self.i=5
        self.j=7
        scrolled.ScrolledPanel.__init__(self, parent, -1)

        vbox = wx.BoxSizer(wx.VERTICAL)
        desc = wx.StaticText(self, -1,
                            "Testtext"
                            )
        desc.SetForegroundColour("Blue")
        vbox.Add(desc, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        vbox.Add(wx.StaticLine(self, -1, size=(900,-1)), 0, wx.ALL, 5)
        vbox.Add((20,20))

        words = text.split()

        panel1 = scrolled.ScrolledPanel(self, -1, size=(800, 600),
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1" )
        fgs1 = wx.FlexGridSizer(cols=2, vgap=4, hgap=4)
        
        PanelID=6000
        a={}
        i=1
                
        for word in words:
            label = wx.StaticText(panel1, -1, "Rate"+word+":")

            tc = wx.TextCtrl(panel1, -1, word, size=(50,-1))
            
            test="test_%s"%(word)
                     
            tab=PanelTabelle(parent=panel1, id=PanelID,
                size=wx.Size(500, 323), style=0, name=test, sizer=test,i=self.i,j=self.j)
            
            ident=PanelID+1
                        
            PanelID+=2
            i+=1
            
            fgs1.Add(label, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
            fgs1.Add(tc, flag=wx.RIGHT, border=10)
            fgs1.AddSpacer(wx.Size(30, 30), border=4, flag=0)
            fgs1.Add(tab)
            for x in xrange (0,self.i):
                for y in xrange (0,self.j):
                    tab.gridname.SetCellValue(x,y,"%s(%s,%s)"%(word,x,y))
        
        panel1.SetSizer( fgs1 )
        panel1.SetAutoLayout(1)
        panel1.SetupScrolling()

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((20,20))
        hbox.Add(panel1, 0, wx.FIXED_MINSIZE)
        hbox.Add((40, 10))

        vbox.Add(hbox, 0)
        self.SetSizer(vbox)
        self.SetAutoLayout(1)
        self.SetupScrolling()


#----------------------------------------------------------------------

class RunDemoApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, redirect=False)


    def OnInit(self):
        wx.Log_SetActiveTarget(wx.LogStderr())

        frame = wx.Frame(None, -1, "RunDemo: " , pos=(50,50), size=(800,600),
                        style=wx.DEFAULT_FRAME_STYLE)
        frame.CreateStatusBar()

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        item = menu.Append(-1, "E&xit\tAlt-X", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, item)
        menuBar.Append(menu, "&File")
        
        frame.SetMenuBar(menuBar)
        frame.Show(True)
        frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        
        self.window = TestPanel(frame)
        frect = frame.GetRect()

        self.SetTopWindow(frame)
        self.frame = frame

                    
        return True


    def OnExitApp(self, evt):
        self.frame.Close(True)


    def OnCloseFrame(self, evt):
        evt.Skip()
  
     
#----------------------------------------------------------------------



def main():

    app = RunDemoApp()
    app.MainLoop()
    
if __name__ == '__main__':
    main()

Leider habe ich dass mit dem Datenzugriff nicht kappiert!
Was ist denn der Unterschied zwischen Tabelle und Grid?
Wie man in meinem Beispiel sieht, gibt es da mehrere TextCtrls und Grids.
Ich müsste zum Beispiel den Inhalt dieser Felder abspeichern.
Ich initialisiere die Klasse PanelTabelle zur Zeit öfter aus der Klasse TestPanel heraus.
Ich weiß nur, dass ich mit PanelTabelle.gridname.GetCellValue(1,1) einen Wert bekomme, ich müsste ja jetzt nur noch steuern können, aus welcher der erzeugten Grids, sie heißen ja alle gleich (PanelTabelle.gridname), oder???

Viele Grüße

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

Ach, vergessen:

Ich habe folgende wx-Version installiert:

wxPython2.5-win32-ansi-2.5.4.1-py23

Und bei mir erscheint kreine Fehlermeldung!

Gruß

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

Hoi Jens,

Zu Tabelle vs. Grid: Entschuldige - das muß ich in einem Anfall geistiger Umnachtung geschrieben haben. Ist natürlich Blödsinn.

Zu der Frage des Zugriffs: Du hast eine Schleife "for word in words". Wenn Du vor die Schleife eine Liste setzt (z.B. "self.tabellen = []") und ganz am Ende der Schleife schreibst: "self.tabellen.append(tab)" hast Du eine Liste mit allen Tabellen, bzw. PanelTabellen-instanzen. Die kannst Du dann in "TestPanel" ansprechen. Wie das am besten geht? Oh, da bräuchte ich jetzt auch ein ganz schönes Weilchen ... ;-)

Ach, und Du mußt natürlich nicht unbedingt eine Fehlermeldung bekommen, sondern nur eine Warnung, daß etwas veraltet ist. Diese Warnung kannst Du natürlich unterdrücken, Du läufst dann aber Gefahr, daß die Funktion, die Du nutzen wolltest irgendwann nicht mehr unterstützt wird. (Ich weiß nicht wie es in 2.6 ist, denn das nutze ich selber nicht.)

Gruß,
Christian
JensP_ohneLogin

Hallo,

vielen Dank für deinen Tip mit der Liste!!!

Scheint zu funktionieren!

Zu deiner Fehlermeldung:

Wie lautet den die aktuelle (warnungsfreie) Syntax?

statt SIZER.AddSpacer(...) eher SIZER.Add((40, 10)) ???

Ich werde meinen Code demnächst dann mal hier posten, vielleicht kannst du mir ja noch weitere "Schönheitsfehler" zeigen?

Gruß

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

Hallo,

hier jetzt ein einigermaßen 'schöner' Code mit funktionierendem Zugriff auf die gewünschte Tabelle durch die Liste (siehe OnSaveApp)!!!

Noch eine Frage:

Gibt es einen wxGrid-Style, der die Tabelle ohne Scrolls anzeigt und die Anzeige-Größe der Tabellengröße anpasst, so das die gesamte Tabelle ohne Rand dargestellt wird?

Code: Alles auswählen


import  wx
import  wx.lib.scrolledpanel as scrolled
import  wx.grid
import  pickle
import  EingabePanel

#----------------------------------------------------------------------

class Eingabefeld(wx.Panel):
  
    def __init__(self, parent, name, bezeichnung,i,j):
        #Uebernahme der Parameter vom Klassenaufruf (instanzieren))
        self.i=i
        self.j=j
        self.parent=parent
        self.name=name
        self.tabelle=bezeichnung
##        #Zuweisen einer neuen ID
        wxID_CALCULATE=wx.NewId()

        #Panel
        wx.Panel.__init__(self, id=-1, name=self.name,
              parent=self.parent,
              style=wx.TAB_TRAVERSAL)
            
        self.Rate = wx.StaticText(id=-1, label='Rate'+' '+self.name,
              name='Rate', parent=self, style=0)
        self.Rate.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Microsoft Sans Serif'))
    
        self.rate = wx.TextCtrl(id=-1, name='rate',
              parent=self, size=wx.Size(100, 21), style=0,
              value='')
    
        self.staticText2 = wx.StaticText(id=-1,
              label='s^-1', name='staticText2', parent=self, size=wx.Size(20, 13), style=0)
    
        self.TEMPDEP = wx.CheckBox(id=-1,
              label='temperature dependent?', name='TEMPDEP', parent=self,
              size=wx.Size(200, 13), style=0)
        self.TEMPDEP.SetValue(False)
    
        self.tabelle = wx.grid.Grid(id=-1, name=self.name,
              parent=self,
              style=wx.CAPTION | wx.MINIMIZE_BOX)
        
        
        self.CALCULATE = wx.Button(id=wxID_CALCULATE,
              label='Calculate', name='CALCULATE', parent=self, size=wx.Size(75, 23), style=0)
       
        self.Bind(wx.EVT_BUTTON, self.OnCalculate, id=wxID_CALCULATE)
    
        self.NOMST = wx.RadioButton(id=-1,
              label='nominal strain / stress', name='NOMST', parent=self,
              size=wx.Size(150, 13), style=0)
        self.NOMST.SetValue(True)
    
        self.TRUST = wx.RadioButton(id=-1,
              label='total logarithmic strain / true stress', name='TRUST',
              parent=self, size=wx.Size(200, 13),
              style=0)
        self.TRUST.SetValue(False)
    
        self.boxSizer1 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer1.Add(self.Rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.Add((15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.Add((15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.staticText2, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
    
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer2.Add(self.CALCULATE, 0, border=2, flag=0)
        self.boxSizer2.Add((15, 15), border=0, flag=0)
        
        self.boxSizer3 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3.Add(self.NOMST, 0, border=0, flag=0)
        self.boxSizer3.Add((15, 15), border=0, flag=0)
        self.boxSizer3.Add(self.TRUST, 0, border=0, flag=0)
    
        self.flexGridSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer1, 2, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.TEMPDEP, 0, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer3, 0, border=0, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.tabelle, 0, border=10, flag=0)
        
        self.flexGridSizer1.Add(self.boxSizer2, 0, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
               
        Eingabefeld.SetSizer(self, self.flexGridSizer1 )
        Eingabefeld.SetAutoLayout(self, 1)
        
        self.tabelle.CreateGrid(self.i,self.j)

        
    def OnCalculate(self, evt):
##        a=self.tabelle.GetCellValue(0,0)
        self.tabelle.SetCellValue(0,1,self.tabelle.GetCellValue(0,0))
        evt.Skip() 

#----------------------------------------------------------------------       
       

class Arbeitsbereich(scrolled.ScrolledPanel):
    def __init__(self, parent):
        self.i=5
        self.j=7
        scrolled.ScrolledPanel.__init__(self, parent, -1)

        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # Text oberhalb des Trennstrichs
        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 = scrolled.ScrolledPanel(self, -1, size=(700, 400),
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1" )
        self.fgs1 = wx.FlexGridSizer(cols=1, vgap=4, hgap=4)
                
        # Wichtig: hier wird die Liste erzeugt, in der die instanzierten Klassen abgespeichert werden
        self.tabellenspeicher=[]
                        
        #tab=EingabePanel.Panel1(self)
                 
        tab=Eingabefeld(parent=self.panel1,
            name='test', bezeichnung='test',i=self.i,j=self.j)

        self.fgs1.Add(tab)
        for x in xrange (0,self.i):
            for y in xrange (0,self.j):
                tab.tabelle.SetCellValue(x,y,"%s(%s,%s)"%('word',x,y))
        
        # anhaengen der Klasse tab an die Liste tabellenspeicher
        self.tabellenspeicher.append(tab)
        #print len(self.tabellenspeicher)
        
        self.panel1.SetSizer( self.fgs1 )
        self.panel1.SetAutoLayout(1)
        self.panel1.SetupScrolling()
        
        wxID_ANOTHERRATE=wx.NewId()
        
        self.AnotherRate = wx.Button(id=wxID_ANOTHERRATE,
              label='AnotherRate', name='AnotherRate', parent=self, size=wx.Size(75, 23), style=0)
       
        self.Bind(wx.EVT_BUTTON, self.OnAnotherRate, id=wxID_ANOTHERRATE)

        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)
        vbox.Add(self.AnotherRate,0,wx.FIXED_MINSIZE)
        self.SetSizer(vbox)
        self.SetAutoLayout(1)
        self.SetupScrolling()
    
    def OnAnotherRate(self, evt):
        tab=Eingabefeld(parent=self.panel1,
            name='test', bezeichnung='test',i=self.i,j=self.j)

        self.fgs1.Add(tab)
        for x in xrange (0,self.i):
            for y in xrange (0,self.j):
                tab.tabelle.SetCellValue(x,y,"%s(%s,%s)"%('word',x,y))
        self.tabellenspeicher.append(tab)
        print len(self.tabellenspeicher)
        
        self.panel1.SetSizer( self.fgs1 )
        self.panel1.SetAutoLayout(1)
        self.panel1.SetupScrolling()
        evt.Skip() 


#----------------------------------------------------------------------

class Hauptfenster(wx.App):
    def __init__(self):
##        self.name = name
        wx.App.__init__(self, redirect=False)


    def OnInit(self):

        frame = wx.Frame(None, -1, "Eingabefenster " , pos=(50,50), size=(800,600),
                        style=wx.DEFAULT_FRAME_STYLE)
        frame.CreateStatusBar()

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        
        item1 = menu.Append(8998, "E&xit\tAlt-X", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, id=8998)
        
        item2 = menu.Append(8999, "&Save\tCtrl-s", "Save")
        self.Bind(wx.EVT_MENU, self.OnSaveApp, id=8999)
        menuBar.Append(menu, "&File")
        
        
        frame.SetMenuBar(menuBar)
        frame.Show(True)
        frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        
        self.window = Arbeitsbereich(frame)

        self.SetTopWindow(frame)
        self.frame = frame

                    
        return True


    def OnExitApp(self, evt):
        self.frame.Close(True)


    def OnCloseFrame(self, evt):
        evt.Skip()
  
  
    def OnSaveApp(self, evt):
        #der FileDialog zum Festlegen des Speicherorts und Dateinamen(*.alm, Überschreibabfrage)
        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT)
        # try-finally-Konstrukt: beim Fehler in der try-Sequenz wird nach finally weitergeleitet
        try:
            if dlg.ShowModal() == wx.ID_OK:
                #Abfragen des oben definierten Dateinnamen
                filename = dlg.GetPath()
                #Erstellen des Dict a
                a={}
                #Anzahl der Tabellen
                a['Tabellen']=len(self.window.tabellenspeicher)
                #Schleife ueber Tabellen im Tabellenspeicher
                for z in xrange(0,len(self.window.tabellenspeicher)):
                    #Schleife ueber x (Zeilen der Tabelle)
                    for x in xrange(0,self.window.tabellenspeicher[z-1].i):
                        #Schleife ueber y (Spalten der Tabelle)
                        for y in xrange(0,self.window.tabellenspeicher[z-1].j):
                            #unter a['text',z,x,y] wird der Eintrag aus der x. Zeile, y. Spalte, z. Tabelle abgelegt
                            a['text',z,x,y]=self.window.tabellenspeicher[z-1].tabelle.GetCellValue(x,y)
##                            print a['text',z,x,y]
                #Öffnet zum Schreiben die Datei, existiert sie nicht, wird sie erstellt            
                f=open(filename, "w")
                #Schreibt in die erste Zeile 'Test'
                f.write('Test')
                #Zeilenumbruch
                f.write("\n")
                #Schreibt den Dateinnamen in die Datei
                f.write(filename)
                #Zweimal Zeilenumbruch
                f.write("\n\n")
                #Scheibt das dict a mit allen Einträgen in die Datei
                pickle.dump(a,f)
                #Schiesst die Datei
                f.close()
##                self.FileName=filename
##                self.SetTitle(('MatProg AUTOLIV - %s') % filename) 
        #Am Ende oder bei Ausnahmen in der try-Sequenz
        finally:
            #Beendet den Datei- und Speicherdialog und schliesst seine Fenster
            dlg.Destroy() 
            
##    def OnOpenApp(self, evt):
##        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT)
##        try:
##            if dlg.ShowModal() == wx.ID_OK:
##                filename = dlg.GetPath()
##                # Your code
##                a={}
##                a['Tabellen']=len(self.window.tabellenspeicher)
##                for z in xrange(0,len(self.window.tabellenspeicher)):
##                    for x in xrange(0,self.window.tabellenspeicher[z-1].i):
##                        for y in xrange(0,self.window.tabellenspeicher[z-1].j):
##                            self.window.tabellenspeicher[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 AUTOLIV - %s') % filename) 
##        finally:
##            dlg.Destroy()

##     
#----------------------------------------------------------------------



def main():

    app = Hauptfenster()
    app.MainLoop()
    
if __name__ == '__main__':
    main()
Die Methode 'OnOpenApp' muss ich noch ausformulieren.
Gibt es noch weitere 'Schönheitsfehler' im Code?

Vielen Dank!

Gruß

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

Hallo, habe noch etwas weiter programmiert:
Wieso funktioniert das nicht so?
Ich möchte gerne den Inhalt des Frames durch unterschiedliche Panels füllen!

Code: Alles auswählen


import  wx
import  wx.lib.scrolledpanel as scrolled
import  wx.grid
import  pickle
import  EingabePanel

#----------------------------------------------------------------------

class Eingabefeld(wx.Panel):
  
    def __init__(self, parent, name, bezeichnung,i,j):
        #Uebernahme der Parameter vom Klassenaufruf (instanzieren))
        self.i=i
        self.j=j
        self.parent=parent
        self.name=name
        self.tabelle=bezeichnung
##        #Zuweisen einer neuen ID
        wxID_CALCULATE=wx.NewId()

        #Panel
        wx.Panel.__init__(self, id=-1, name=self.name,
              parent=self.parent,
              style=wx.TAB_TRAVERSAL)
            
        self.Rate = wx.StaticText(id=-1, label='Rate'+' '+self.name,
              name='Rate', parent=self, style=0)
        self.Rate.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Microsoft Sans Serif'))
    
        self.rate = wx.TextCtrl(id=-1, name='rate',
              parent=self, size=wx.Size(100, 21), style=0,
              value='')
    
        self.staticText2 = wx.StaticText(id=-1,
              label='s^-1', name='staticText2', parent=self, size=wx.Size(20, 13), style=0)
    
        self.TEMPDEP = wx.CheckBox(id=-1,
              label='temperature dependent?', name='TEMPDEP', parent=self,
              size=wx.Size(200, 13), style=0)
        self.TEMPDEP.SetValue(False)
    
        self.tabelle = wx.grid.Grid(id=-1, name=self.name,
              parent=self,
              style=wx.CAPTION | wx.MINIMIZE_BOX)
        
        
        self.CALCULATE = wx.Button(id=wxID_CALCULATE,
              label='Calculate', name='CALCULATE', parent=self, size=wx.Size(75, 23), style=0)
       
        self.Bind(wx.EVT_BUTTON, self.OnCalculate, id=wxID_CALCULATE)
    
        self.NOMST = wx.RadioButton(id=-1,
              label='nominal strain / stress', name='NOMST', parent=self,
              size=wx.Size(150, 13), style=0)
        self.NOMST.SetValue(True)
    
        self.TRUST = wx.RadioButton(id=-1,
              label='total logarithmic strain / true stress', name='TRUST',
              parent=self, size=wx.Size(200, 13),
              style=0)
        self.TRUST.SetValue(False)
    
        self.boxSizer1 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer1.Add(self.Rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.Add((15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.rate, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
        self.boxSizer1.Add((15, 15), border=0, flag=0)
        self.boxSizer1.Add(self.staticText2, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
    
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer2.Add(self.CALCULATE, 0, border=2, flag=0)
        self.boxSizer2.Add((15, 15), border=0, flag=0)
        
        self.boxSizer3 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3.Add(self.NOMST, 0, border=0, flag=0)
        self.boxSizer3.Add((15, 15), border=0, flag=0)
        self.boxSizer3.Add(self.TRUST, 0, border=0, flag=0)
    
        self.flexGridSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer1, 2, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.TEMPDEP, 0, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.boxSizer3, 0, border=0, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
        self.flexGridSizer1.Add(self.tabelle, 0, border=10, flag=0)
        
        self.flexGridSizer1.Add(self.boxSizer2, 0, border=10, flag=0)
        self.flexGridSizer1.Add((15, 15), border=0, flag=0)
               
        Eingabefeld.SetSizer(self, self.flexGridSizer1 )
        Eingabefeld.SetAutoLayout(self, 1)
        
        self.tabelle.CreateGrid(self.i,self.j)

        
    def OnCalculate(self, evt):
##        a=self.tabelle.GetCellValue(0,0)
        self.tabelle.SetCellValue(0,1,self.tabelle.GetCellValue(0,0))
        evt.Skip() 

#----------------------------------------------------------------------       
       

class ArbeitsbereichEingabe(scrolled.ScrolledPanel):
    def __init__(self, parent):
        self.i=5
        self.j=7
        scrolled.ScrolledPanel.__init__(self, parent, -1)

        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # Text oberhalb des Trennstrichs
        desc = wx.StaticText(self, -1,
                            "Testtext \n"
                            "Testtext \n"
                            "Testtext \n"
                            "Testtext \n"
                            "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 = scrolled.ScrolledPanel(self, -1, size=(700, 400),
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1" )
        self.fgs1 = wx.FlexGridSizer(cols=1, vgap=4, hgap=4)
                
        # Wichtig: hier wird die Liste erzeugt, in der die instanzierten Klassen abgespeichert werden
        self.tabellenspeicher=[]
                        
        #tab=EingabePanel.Panel1(self)
                 
        tab=Eingabefeld(parent=self.panel1,
            name='test', bezeichnung='test',i=self.i,j=self.j)

        self.fgs1.Add(tab)
        for x in xrange (0,self.i):
            for y in xrange (0,self.j):
                tab.tabelle.SetCellValue(x,y,"%s(%s,%s)"%('word',x,y))
        
        # anhaengen der Klasse tab an die Liste tabellenspeicher
        self.tabellenspeicher.append(tab)
        #print len(self.tabellenspeicher)
        
        self.panel1.SetSizer( self.fgs1 )
        self.panel1.SetAutoLayout(1)
        self.panel1.SetupScrolling()
        
        wxID_ANOTHERRATE=wx.NewId()
        
        self.AnotherRate = wx.Button(id=wxID_ANOTHERRATE,
              label='AnotherRate', name='AnotherRate', parent=self, size=wx.Size(75, 23), style=0)
       
        self.Bind(wx.EVT_BUTTON, self.OnAnotherRate, id=wxID_ANOTHERRATE)

        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)
        vbox.Add(self.AnotherRate,0,wx.FIXED_MINSIZE)
        self.SetSizer(vbox)
        self.SetAutoLayout(1)
        self.SetupScrolling()
    
    def OnAnotherRate(self, evt):
        tab=Eingabefeld(parent=self.panel1,
            name='test', bezeichnung='test',i=self.i,j=self.j)

        self.fgs1.Add(tab)
        for x in xrange (0,self.i):
            for y in xrange (0,self.j):
                tab.tabelle.SetCellValue(x,y,"%s(%s,%s)"%('word',x,y))
        self.tabellenspeicher.append(tab)
        print len(self.tabellenspeicher)
        
        self.panel1.SetSizer( self.fgs1 )
        self.panel1.SetAutoLayout(1)
        self.panel1.SetupScrolling()
        evt.Skip() 


#----------------------------------------------------------------------
class ArbeitsbereichStart(scrolled.ScrolledPanel):
    def __init__(self, parent):
        scrolled.ScrolledPanel.__init__(self, parent, -1)
        self.parent=parent
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # Text oberhalb des Trennstrichs
        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))

        wxID_EINGABE=wx.NewId()
        
        self.Eingabe = wx.Button(id=wxID_EINGABE,
              label='Materialkarte anlegen und bearbeiten', name='Eingabe', parent=self,  style=0)
       
        self.Bind(wx.EVT_BUTTON, self.OnEingabe, id=wxID_EINGABE)

        vbox.Add(self.Eingabe,0,wx.FIXED_MINSIZE)
        self.SetSizer(vbox)
        self.SetAutoLayout(1)
        self.SetupScrolling()
    
    def OnEingabe(self, evt):
        Hauptfenster.window = ArbeitsbereichEingabe(self.parent)
 

#----------------------------------------------------------------------

class Hauptfenster(wx.App):
    def __init__(self):
        wx.App.__init__(self, redirect=False)


    def OnInit(self):

        self.frame = wx.Frame(None, -1, "Eingabefenster " , pos=(50,50), size=(800,600),
                        style=wx.DEFAULT_FRAME_STYLE)
        self.frame.CreateStatusBar()

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        
        item1 = menu.Append(8998, "E&xit\tAlt-X", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, id=8998)
        
        item2 = menu.Append(8999, "&Save\tCtrl-s", "Save")
        self.Bind(wx.EVT_MENU, self.OnSaveApp, id=8999)
        menuBar.Append(menu, "&File")
        
##        menu.Append(help='Save material-set', id=8997,
##              kind=wx.ITEM_NORMAL, text='Save\tCtrl+S')
##        self.Bind(wx.EVT_MENU, self.OnMenuFileNewMenu, id=8997)
        
        self.frame.SetMenuBar(menuBar)
        self.frame.Show(True)
        self.frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        
        self.window = ArbeitsbereichStart(self.frame)

        self.SetTopWindow(self.frame)
                    
        return True


    def OnExitApp(self, evt):
        self.frame.Close(True)


    def OnCloseFrame(self, evt):
        evt.Skip()
  
  
    def OnSaveApp(self, evt):
        #der FileDialog zum Festlegen des Speicherorts und Dateinamen(*.alm, Überschreibabfrage)
        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT)
        # try-finally-Konstrukt: beim Fehler in der try-Sequenz wird nach finally weitergeleitet
        try:
            if dlg.ShowModal() == wx.ID_OK:
                #Abfragen des oben definierten Dateinnamen
                filename = dlg.GetPath()
                #Erstellen des Dict a
                a={}
                #Anzahl der Tabellen
                a['Tabellen']=len(self.window.tabellenspeicher)
                #Schleife ueber Tabellen im Tabellenspeicher
                for z in xrange(0,len(self.window.tabellenspeicher)):
                    #Schleife ueber x (Zeilen der Tabelle)
                    for x in xrange(0,self.window.tabellenspeicher[z-1].i):
                        #Schleife ueber y (Spalten der Tabelle)
                        for y in xrange(0,self.window.tabellenspeicher[z-1].j):
                            #unter a['text',z,x,y] wird der Eintrag aus der x. Zeile, y. Spalte, z. Tabelle abgelegt
                            a['text',z,x,y]=self.window.tabellenspeicher[z-1].tabelle.GetCellValue(x,y)
##                            print a['text',z,x,y]
                #Öffnet zum Schreiben die Datei, existiert sie nicht, wird sie erstellt            
                f=open(filename, "w")
                #Schreibt in die erste Zeile 'Test'
                f.write('Test')
                #Zeilenumbruch
                f.write("\n")
                #Schreibt den Dateinnamen in die Datei
                f.write(filename)
                #Zweimal Zeilenumbruch
                f.write("\n\n")
                #Scheibt das dict a mit allen Einträgen in die Datei
                pickle.dump(a,f)
                #Schiesst die Datei
                f.close()
                self.FileName=filename
                self.SetTitle(('MatProg daddel - %s') % filename) 
        #Am Ende oder bei Ausnahmen in der try-Sequenz
        finally:
            #Beendet den Datei- und Speicherdialog und schliesst seine Fenster
            dlg.Destroy() 
            
##    def OnOpenApp(self, evt):
##        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT)
##        try:
##            if dlg.ShowModal() == wx.ID_OK:
##                filename = dlg.GetPath()
##                # Your code
##                a={}
##                a['Tabellen']=len(self.window.tabellenspeicher)
##                for z in xrange(0,len(self.window.tabellenspeicher)):
##                    for x in xrange(0,self.window.tabellenspeicher[z-1].i):
##                        for y in xrange(0,self.window.tabellenspeicher[z-1].j):
##                            self.window.tabellenspeicher[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 daddel - %s') % filename) 
##        finally:
##            dlg.Destroy()

##     
#----------------------------------------------------------------------



def main():

    app = Hauptfenster()
    app.MainLoop()
    
if __name__ == '__main__':
    main()
Vielen Dank!

Bei dem Wetter wünsche ich Euch allen eine schönes Wochenende!!!
Ich werde mich wohl mal auf mein Fahrrad schwingen und schön an der Ostsee entlang fahren (und evtl. auch mal rein springen)!

Gruß

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

Hoi Jens,

das mit der Ostsee wäre nicht nötig gewesen :x ! Ich wünsche Dir trotzdem viel Spaß.

Also, ich möchte festhalten: Du magst es kompliziert, hm? Unnötig kompliziert? so richtig von hinten durch die Brust ins Auge?
Und Du hast Deine Panels noch nie gesehen, richtig?

Na, ich habe mich mal Deiner Anwendung befasst und ein bißchen was geändert, aber eine Lösung liefere ich (noch) nicht ;-). Stattdessen habe ich ein paar allgemeine Kommentare eingefügt, die Dich weiterbringen sollten.

Gruß,
Christian

Code: Alles auswählen

import  wx 
import  wx.lib.scrolledpanel as scrolled 
import  wx.grid 
import  pickle 
#CM: Was ist 'EingabePanel'? Das wird doch gar nicht von Dir verwendet, oder?
#CM: Es gibt nur eine Zeile mit 'EingabePanel' und die ist auskommentiert.
#import  EingabePanel 

#CM: Allgemein: Keine Umlaute - auch nicht in Kommentaren. Es sei denn Du hast
#CM: eine wxPython-Version mit Unicodeunterstuetzung UND deklarierst das Encoding.

#---------------------------------------------------------------------- 

class Eingabefeld(wx.Panel): 
  
    def __init__(self, parent, name, bezeichnung,i,j): 
    	#CM: Ich habe weiter unten noch was ueber Kommentare und Doc-Strings geschrieben,
    	#CM: das trifft auch hier zu.
        #Uebernahme der Parameter vom Klassenaufruf (instanzieren)) 
        self.i=i 
        self.j=j 
        self.parent=parent 
        self.name=name 
        self.tabelle=bezeichnung 
<snip> Hier habe ich nicht weiter dran gesessen: Ich bin am Anfang ausgestiegen und der ist bei Dir weiter unten

class ArbeitsbereichEingabe(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
        self.i=5 
        self.j=7 
        scrolled.ScrolledPanel.__init__(self, parent, -1) 
        self.parent = parent #CM: so etwas musst Du einbauen,
        #CM: wenn Du drauf zugreifen willst - was Du hier aber nicht tust

        vbox = wx.BoxSizer(wx.VERTICAL) 
<snip>
#CM: Wozu brauchst Du die folgende Klasse? Macht die irgend etwas Nuetzliches?
#CM: Ich finde sie verwirrt nur.
#CM: Ausserdem: Wieso leitest Du von ScrolledPanel ab? Das brauchst Du doch hier gar nicht?
#CM: Ich habe das mal fuers Beispiel geaendert.
#class ArbeitsbereichStart(scrolled.ScrolledPanel): 
class ArbeitsbereichStart(wx.Panel):
    def __init__(self, parent): 
        #scrolled.ScrolledPanel.__init__(self, parent, -1) 
        wx.Panel.__init__(self,parent,-1)
        self.parent=parent 
        vbox = wx.BoxSizer(wx.VERTICAL) 
        
        # Text oberhalb des Trennstrichs 
        desc = wx.StaticText(self, -1, 
                            "Testtext \n" 
                            "Blablabla" 
                            ) 
        desc.SetForegroundColour("Blue") 
        vbox.Add(desc, 0, wx.ALIGN_LEFT|wx.ALL, 5) 
        #CM: Diese Linie ist nicht zentriert und passt nur ungefaehr in DEIN Fenster. Wenn jemand die Fenstergroesse
        #CM: veraendert siehr das ziemlich bescheiden aus.
        vbox.Add(wx.StaticLine(self, -1, size=(700,-1)), 0, wx.ALL, 5) 
        vbox.Add((20,20)) 
        
        #CM: Das hier hat mich ehrlich gestoert. So etwas wuerde ich an Deiner Stelle vermeiden,
        #CM: sonst werden irgendwann Leute gar nicht mehr durch Deinen Code durchsteigen! Was ist der Fehler?
        #CM: Du importierst wxPython und benutzt die neuen Namespaces. Ok. Und jetzt deklarierst Du etwas mit 
        #CM: wx in der alten Syntax??? Und dann etwas was es nicht gibt? Einfach das wx vor der ID_EINGABE weglassen.
        wxID_EINGABE=wx.NewId() 
        
        self.Eingabe = wx.Button(id=wxID_EINGABE, 
              label='Materialkarte anlegen und bearbeiten', name='Eingabe', parent=self,  style=0) 
        
        self.Bind(wx.EVT_BUTTON, self.OnEingabe, id=wxID_EINGABE) 

        vbox.Add(self.Eingabe,0,wx.FIXED_MINSIZE) 
        self.SetSizer(vbox) 
        self.SetAutoLayout(1) 
        #CM: bei Ableitung von wx.Panel entfaellt auch die folgende Zeile
        #self.SetupScrolling() 
    
    def OnEingabe(self, evt): 
        #CM: Wenn Du das machst, ein Panel gegen das andere austauschen, weisst Du dann noch
        #CM: was parent von wem ist? Auch nach Deinen Verschachtelungen?
        #CM: Ich jedenfalls habe gebraucht zu begreifen, dass self.parent der Frame des parent ist,
        #CM: aber nicht die Applikation (geht ja eigentlich auch gar nicht). Aber das heisst, dass
        #CM: Du von hier aus gar nicht auf Funktionen der App zugreifen kannst! Und deshalb ist es mir
        #CM: auch zu schwer von hier weiterzugehen.
        Hauptfenster.window = ArbeitsbereichEingabe(self.parent)

#---------------------------------------------------------------------- 

#CM: Diese Klasse ist ein klassischer Overkill: Du erreichst, was Du nicht erreichen willst.
#CM: Was soll denn in der App-Klasse definiert sein? Funktionalitaet, die die Applikation ausmacht.
#CM: Mehr nicht.
#CM: Besser waere es eine App-Klasse zu haben und dann eine von Frame abgeleitete Klasse, sonst ist
#CM: das Ansprechen von Funktionen im Hauptframe und das Austauschen von Panels wirklich schwierig. Z.B.:
#CM:
#CM: class MyApp(wx.App):
#CM:     def OnInit(self):
#CM:         frame = Hauptfenster(self,-1,'titel')
#CM:         frame.Show(True)
#CM:         self.SetTopWindow(frame)
#CM:         return True
class Hauptfenster(wx.App): 
    def __init__(self): 
        wx.App.__init__(self, redirect=False) 

    #CM: Warum definierst Du 'OnInit'? Diese Funktion wird nie gesondert aufgerufen.
    def OnInit(self): 

        self.frame = wx.Frame(None, -1, "Eingabefenster " , pos=(50,50), size=(800,600), 
                        style=wx.DEFAULT_FRAME_STYLE) 
        self.frame.CreateStatusBar() 

        menuBar = wx.MenuBar() 
        menu = wx.Menu() 
        
        #CM: wenn Du grosse Menus schreiben willst, ist es u. U. uebersichtlicher Deklaration und Bindung
        #CM: zu trennen und zwei Bloecke drauss zu machen.
        item1 = menu.Append(8998, "&Exit\tAlt-X", "Exit demo") #CM: Du hattest hier noch einen Tippfehler: "E&xit"!
        #CM: was haellst Du davon, anstelle von Deiner Deklaration?
        #CM: menu.Append(8998, "&Exit\tAlt-X", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, id=8998) 
        
        item2 = menu.Append(8999, "&Save\tCtrl-s", "Save") 
        self.Bind(wx.EVT_MENU, self.OnSaveApp, id=8999) 
        menuBar.Append(menu, "&File") 
        
##        menu.Append(help='Save material-set', id=8997, 
##              kind=wx.ITEM_NORMAL, text='Save\tCtrl+S') 
##        self.Bind(wx.EVT_MENU, self.OnMenuFileNewMenu, id=8997) 
        
        self.frame.SetMenuBar(menuBar) 
        #self.frame.Show(True) #CM: True ist Default.
        self.frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame) 
        
        #CM: Waere es nicht besser frame.Show hinter der Initialisierung zu zeigen???
        #CM: Bei mir laeuft sonst gar nichts.
        self.window = ArbeitsbereichStart(self.frame)
        self.frame.Show(True) 

        self.SetTopWindow(self.frame) 
                    
        return True 


    def OnExitApp(self, evt): 
        self.frame.Close(True) 


    def OnCloseFrame(self, evt): 
        evt.Skip()
        
    def OnShowEingabe(self,evt):
        self.window = ArbeitsbereichEingabe(self.frame)
        self.frame.Show()


    def OnSaveApp(self, evt): 
        #CM: Am besten ist es jede Funktion mit einem Doc-String zu versehen. Z.B.:
        #CM: """
        #CM" 	File Dialog zum Festlegen des Speicherorts und Dateinamen(*.alm, Ueberschreibabfrage)
        #CM: 	Ist abgeleitet von wx.FileDialog - keine Besonderheiten. Aufgerufen von Menu id=8999
        #CM: """
        #CM: Dann kann die folgende Zeile entfallen. Schau mal in der Doku nach Doc-Strings was die
        #CM: so alles fuer Dich tun koennen
        #der FileDialog zum Festlegen des Speicherorts und Dateinamen(*.alm, Ueberschreibabfrage) 
        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT) 
        #CM: hier gibst ingesamt zu viele Kommentare: Du musst nicht kommentieren was sowieso offensichtlich
        #CM: ist wie "#Erstellen des Dict a", sondern eher wozu das dict da ist, was Du logisch anstrebst.
        #CM: Wenn Du in drei Monaten Dein Program anschauen wirst, wirst Du zwar verstehen was da gemacht wird,
        #CM: aber nicht unbedingt warum. Insgesamt gilt natuerlich, lieber ein Kommentar zuviel als zuwenig.
        # try-finally-Konstrukt: beim Fehler in der try-Sequenz wird nach finally weitergeleitet 
        try: 
            if dlg.ShowModal() == wx.ID_OK: 
                #Abfragen des oben definierten Dateinnamen 
                filename = dlg.GetPath() 
                #Erstellen des Dict a 
                a={} 
                #Anzahl der Tabellen 
                a['Tabellen']=len(self.window.tabellenspeicher) 
                #Schleife ueber Tabellen im Tabellenspeicher 
                for z in xrange(0,len(self.window.tabellenspeicher)): 
                    #Schleife ueber x (Zeilen der Tabelle) 
                    for x in xrange(0,self.window.tabellenspeicher[z-1].i): 
                        #Schleife ueber y (Spalten der Tabelle) 
                        for y in xrange(0,self.window.tabellenspeicher[z-1].j): 
                            #unter a['text',z,x,y] wird der Eintrag aus der x. Zeile, y. Spalte, z. Tabelle abgelegt 
                            a['text',z,x,y]=self.window.tabellenspeicher[z-1].tabelle.GetCellValue(x,y) 
##                            print a['text',z,x,y] 
                #Öffnet zum Schreiben die Datei, existiert sie nicht, wird sie erstellt            
                f=open(filename, "w") 
                #Schreibt in die erste Zeile 'Test' 
                #CM: Das geht auch in einer Zeile: "f.write('Test\n')"
                f.write('Test') 
                #Zeilenumbruch 
                f.write("\n") 
                #Schreibt den Dateinnamen in die Datei 
                f.write(filename) 
                #Zweimal Zeilenumbruch 
                f.write("\n\n") 
                #Scheibt das dict a mit allen Einträgen in die Datei
                #CM: Das wuerde ich auf keinen Fall tun!!!!
                #CM: Am besten pickelst Du nur, was Du auch entpickeln kannst: In f stehen aber auch schon
                #CM: andere Eintraege. Jetzt kannst Du zwar hingehen und das wieder auseinanderpfluecken, aber
                #CM: Du machst Dir das leben unnoetig schwer. 
                pickle.dump(a,f) 
                #Schiesst die Datei 
                f.close() 
                self.FileName=filename 
                self.SetTitle(('MatProg daddel - %s') % filename) 
        #Am Ende oder bei Ausnahmen in der try-Sequenz
        #CM: Das 'finally' ist hier sehr schoen, aber wenn Du Fehler abfangen und den Nutzer Deines
        #CM: darueber aufklaeren willst, was schiefgeht, solltest Du noch einen 'except'-clause einbauen.
        finally: 
            #Beendet den Datei- und Speicherdialog und schliesst seine Fenster 
            dlg.Destroy() 

#CM: Was willst Du hier?
            
##    def OnOpenApp(self, evt): 
##        dlg = wx.FileDialog(self.window, "Save file as", ".", "", "*.alm", wx.SAVE|wx.OVERWRITE_PROMPT) 
##        try: 
##            if dlg.ShowModal() == wx.ID_OK: 
##                filename = dlg.GetPath() 
##                # Your code 
##                a={} 
##                a['Tabellen']=len(self.window.tabellenspeicher) 
##                for z in xrange(0,len(self.window.tabellenspeicher)): 
##                    for x in xrange(0,self.window.tabellenspeicher[z-1].i): 
##                        for y in xrange(0,self.window.tabellenspeicher[z-1].j): 
##                            self.window.tabellenspeicher[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 daddel - %s') % filename) 
##        finally: 
##            dlg.Destroy() 

##      
#---------------------------------------------------------------------- 



def main(): 

    app = Hauptfenster() 
    app.MainLoop() 
    
if __name__ == '__main__': 
    main()
Und wenn Du dann noch schön mit Sizern arbeitest und auseinanderklamüserst, was wo parent ist, steht Deiner Anwendung nichts mehr im Wege ...
Antworten