Neues Panel laden

Plattformunabhängige GUIs mit wxWidgets.
Antworten
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

hi

ich hoffe mir kann einer helfen:
1. ich lade einen wx.BoxSizer(wx.HORIZONTAL) dem ich 2 Panels(panel1 und panel2) überweise. Nun möchte ich per Mausklick den 2 Panel neu laden, also sozusagen einen neuen Panel laden.
das ganze lade ich per xrc...

Code: Alles auswählen

wx.Frame.__init__(self,parent,-1,title,pos=(50,50),size=(1100,700))
        self.res = xrc.XmlResource("NWA.xrc")
        #create panels
        self.panel1 = self.res.LoadPanel(self,"PanelLeft")
        self.panel1.SetBackgroundColour(wx.BLUE) 
        self.panel2 = self.res.LoadPanel(self,"PanelRight")
##        self.panel2.SetBackgroundColour(wx.GREEN) 
        TreeLCTRL = TreeListCtrl(self.panel1,self.panel2,self)
        #create sizer and add the panels
        self.mainSizer = wx.BoxSizer(wx.HORIZONTAL)         
        self.mainSizer.Add(self.panel1,0,wx.ALIGN_LEFT)
        self.mainSizer.Add(self.panel2,0,wx.ALIGN_RIGHT)
        #setting the sizer
        self.SetSizer(self.mainSizer) 
        self.SetAutoLayout(1)              
        self.mainSizer.Fit(self) 
        #load the menu
        menu = self.res.LoadMenuBarOnFrame(self,"Menu")
        #load the statusbar
        statusbar = self.CreateStatusBar(style = wx.ST_SIZEGRIP)
        #set the statusbar
        self.SetStatusText("Nutzwertanalyse")
        EVT_MENU(self,XRCID("NWA Beenden"),self.OnExit)
        EVT_MENU(self,XRCID("Neue NWA"),self.OnNew)
        EVT_MENU(self,XRCID("NWA Laden"),self.OnLoad)
        EVT_MENU(self,XRCID("NWA Schliessen"),self.OnClose)
        EVT_MENU(self,XRCID("NWA Speichern"),self.OnSave)
        EVT_MENU(self,XRCID("NWA Speichern als"),self.OnSaveAs)
        EVT_MENU(self,XRCID("Bildschirm"),self.OnDisplay)
        EVT_MENU(self,XRCID("Ueber"),self.OnAbout)
        
    def OnNew(self,evt):
##        self.mainSizer.Detach(self.panel2)
        self.panel2.Destroy()
        
    def OnLoad(self,evt):
        self.res.LoadPanel(self.panel2,"PanelRight")
        self.update()
##        self.mainSizer.Remove(self.panel2
##        self.mainSizer.Add(self.panel2,0,wx.EXPAND)
##        print("hallo")
##        self.resize()
das problem ist, dass wenn ich die panels lade, der Frame immer verunstaltet wird.

die xrc-Datei:

Code: Alles auswählen

<?xml version="1.0" encoding="iso8859-1"?>
<resource>
  <object class="wxFrame" name="NWA">
    <title></title>
    <size>800,800</size>
  </object>
  <object class="wxMenuBar" name="Menu">
    <object class="wxMenu" name="Datei">
      <label>Datei</label>
      <object class="wxMenuItem" name="Neue NWA">        
        <label>Neue NWA</label>
      </object>
      <object class="wxMenuItem" name="NWA Laden">        
        <label>NWA Laden</label>
      </object>
      <object class="wxMenuItem" name="NWA Schliessen">
        <label>NWA Schliessen</label>
      </object>
      <object class="separator"/>
      <object class="wxMenuItem" name="NWA Speichern">  
        <label>NWA Speichern</label>
      </object>
      <object class="wxMenuItem" name="NWA Speichern als">
		<label>NWA Speichern als</label>
      </object>
      <object class="separator"/>
      <object class="wxMenuItem" name="Drucken">
	  <label>Drucken</label>
        <enabled>0</enabled>
      </object>
      <object class="separator"/>
      <object class="wxMenuItem" name="NWA Beenden">
        <label>NWA Beenden</label>
      </object>
    </object>
    <object class="wxMenu" name="Ausgabe">
      <label>Ausgabe</label>
      <object class="wxMenuItem" name="Bildschirm">
        <label>Bildschirm</label>
      </object>
      <object class="wxMenuItem" name="Drucker">
         <label>Drucker</label>
        <enabled>0</enabled>
      </object>
      <object class="wxMenuItem" name="LaTeX">
   <label>LaTeX</label>   
        <enabled>0</enabled>
      </object>
      <object class="wxMenuItem" name="XML">   
        <label>XML</label>
        <enabled>0</enabled>
      </object>
    </object>
    <object class="wxMenu" name="Hilfe">
      <label>Hilfe</label>
      <object class="wxMenuItem" name="Inhalt">
        <label>Inhalt</label>
        <enabled>0</enabled>
      </object>
      <object class="wxMenuItem" name="Index"> 
        <label>Index</label>
        <enabled>0</enabled>
      </object>
      <object class="separator"/>
      <object class="wxMenuItem" name="Ueber"> 
        <label>Ueber</label>
      </object>
    </object>
  </object>
  <object class="wxPanel" name="PanelLeft">
    <size>500,600</size>
    <style>wxSIMPLE_BORDER</style>
  </object>
  <object class="wxPanel" name="PanelRight">
    <size>500,600</size>
    <style>wxSIMPLE_BORDER</style>
  </object>
  <object class="wxPanel" name="WurzelEingabe">
    <size>500,600</size>
    <object class="wxGridSizer">
      <cols>2</cols>
      <rows>2</rows>
      <vgap>0</vgap>
      <hgap>0</hgap>
      <object class="sizeritem">
        <object class="wxBoxSizer">
          <orient>wxVERTICAL</orient>
          <object class="spacer">              
            <size>20,40</size>                    
            <flag>wxRIGHT</flag>
          </object>
          <object class="sizeritem">
            <object class="wxStaticText">                    
              <label>Definition der Bewertungsskala (Kardinalskala)</label>
            </object>                
            <option>3</option>                
            <flag>wxALIGN_CENTRE_HORIZONTAL</flag>
          </object>
          <object class="spacer">
            <size>20,20</size>
          </object>
          <object class="sizeritem">
            <object class="wxBoxSizer">
              <orient>wxHORIZONTAL</orient>
              <object class="sizeritem">
                <object class="wxStaticText">                
                  <label>Wahl der Skalenbreite:  </label>
                </object>              
                <flag>wxALIGN_CENTRE_HORIZONTAL</flag>
              </object>
              <object class="sizeritem">
                <object class="wxComboBox">                
                  <content>
                    <item>1</item>
                    <item>2</item>
                    <item>3</item>
                    <item>4</item>
                    <item>5</item>
                    <item>6</item>
                  </content>
                  <selection>0</selection>
                </object>             
                <flag>wxALIGN_CENTRE_HORIZONTAL</flag>
              </object>
            </object>
          </object>
          <object class="sizeritem">
            <object class="wxListCtrl" name="da">            
              <size>500,100</size>             
              <style>wxLC_LIST</style>
            </object>
          </object>
        </object>
      </object>
    </object>
  </object>
  <object class="wxPanel" name="KnotenEbene">
    <object class="wxBoxSizer">
      <orient>wxVERTICAL</orient>
      <object class="sizeritem">
        <object class="wxStaticText">        
          <label>Eingabe und Bewertung der Kriterien für die Ebene:</label>
        </object>
      </object>
      <object class="spacer">      
        <size>0,10</size>
      </object>
      <object class="sizeritem">
        <object class="wxStaticText">
          
          <label>Name der Ebene:</label>
        </object>
      </object>
      <object class="sizeritem">
        <object class="wxTextCtrl"/>
      </object>
    </object>
  </object>
</resource>
[/code]
Zuletzt geändert von redeye am Sonntag 22. Mai 2005, 14:53, insgesamt 2-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi redeye,

Mir kommen zwar Ideen zu Deinem Post, aber meine Lösungen sind reichlich verquer. Ich möchte vorschlagen, daß, sollte sonst niemand eine elegante Lösung haben, diese Frage in der wxPython-Mailingliste wiederholt werden sollte, denn in Deiner Frage ist auch eine interessante Designfrage eingewoben - finde ich. Ich kann dabei auch helfen, wenn Du möchtest.

Magst Du dennoch Deinen Code in Python-Tags setzen? Und die ewig vielen Leerzeilen im xrc-Teil löschen? Das macht die Sache etwas übersichtlicher.

Gruß,
Christian
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

hi.

Danke für deine Antwort. Ja sry wegen dem code, war da voll im stress. aber wie meinst du das mit den python tags???

ok, ich schreib mal an die mailingliste, ich finde auch, das dies ein wichtiges Thema ist, denn das komische ist, dass ich panels löschen kann aber wie man panels wieder ins frame bringt, ist leider nicht ganz klar...

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

Hoi

Gut, dann bin ich mal gespannt, was da an Antworten kommen wird.

Bzgl. der Code-Tags: Die sind im Moment noch (python) und (/python) anstelle von (code) und (/code) - natürlich mit eckigen statt runden Klammern. Mit der Umstellung des Forums ging da ein "Python-Code"-Button verloren - im anderen Theme kannst Du da noch sehen. Wie Du im offtopic-Bereich sehen kannst, wird daran gearbeitet, das Syntaxhighliting umzustellen, Abhilfe ist in Mache.

Gruß,
Christian
Gast

so ich hab der wxpython maillist zwar schon geschrieben, aber ich hab hier die Lösung schon gefunden:

zuerst alle panels erstellt und dem Sizer geadded. Dann muss man alle mit .Show(panel,show=False,recursive=False) deaktivieren. wenn man dan ein anderes Panel will, muss man das aktive deaktivieren und das deaktivierte aktivieren. und dann noch zum Schluss : self.mainsizer.Layout() ->der refresht das Frame sozusagen.

Code: Alles auswählen

self.LeftPanel = self.res.LoadPanel(self,"PanelLeft")
        self.RightMain = self.res.LoadPanel(self,"PanelRight")
        self.RightWurzel = self.res.LoadPanel(self,"WurzelEingabe")
        self.RightKnoten = self.res.LoadPanel(self,"KnotenEbene")
        self.RightEinzelkriterien = None
        self.RightEinzelkritBew = None
        TreeLCTRL = TreeListCtrl(self.LeftPanel,self)
        #create sizer and add the panels
        self.mainSizer = wx.BoxSizer(wx.HORIZONTAL)         
        self.mainSizer.Add(self.LeftPanel,0,wx.ALIGN_LEFT)
        self.mainSizer.Add(self.RightWurzel,0,wx.ALIGN_RIGHT)
        self.mainSizer.Add(self.RightMain,0,wx.ALIGN_RIGHT)
        self.mainSizer.Add(self.RightKnoten,0,wx.ALIGN_RIGHT)
        self.mainSizer.Show(self.RightWurzel, show=False,recursive=False)
        self.mainSizer.Show(self.RightKnoten, show=False,recursive=False)
        #setting the sizer
        self.SetSizer(self.mainSizer) 
        self.SetAutoLayout(1)              
        self.mainSizer.Fit(self) 

def OnNew(self,evt):
        self.mainSizer.Show(self.RightMain,show=False,recursive=False)
        self.mainSizer.Show(self.RightWurzel,show=True,recursive=False)
        self.mainSizer.Layout()
        None

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

Hoi,

Gut, das muß man sich dann merken. Aber ein bißchen umständlich ist diese Lösung schon, oder? Na ja, das ist halt der Nachteil von wx ...

Gruß,
Christian
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

naja, ich hatte vor Python mit MFC programmiert und ich finde Python in den meisten Dingen besser.
Ist zwar nicht ganz so elegant aber es funzt....
Antworten