Panel aus-/einblenden klappt nicht

Plattformunabhängige GUIs mit wxWidgets.
Antworten
tobias.vdk
User
Beiträge: 19
Registriert: Mittwoch 23. November 2005, 16:51

Hallo!

Ich habe eine Applikation mit einem Frame, zwei Panels mit ihren Sizern und ein Menü. In dem Menü kann ich über zwei Buttons ein Server-Panel und ein Configure-Panel aufrufen. Wenn diese noch nicht initialisiert sind, wird dies getan ansonsten soll bloß das Panel gewechselt werden (ausblenden des einen und einblenden des andere. Auszug:

Code: Alles auswählen

class Application(wx.Frame):

    def __init__(self):

        wx.Frame.__init__(self, None, -1, "createXML", size = (400,300))

        self.pServer = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)

        self.pConfig = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)

        space = 5

        self.sServer = wx.GridBagSizer(space, space)

        self.sConfig = wx.GridBagSizer(space, space)

        #self.sServer.AddGrowableCol(1)

        self.pServer.SetSizerAndFit(self.sServer)

        self.pConfig.SetSizerAndFit(self.sConfig)

        #self.CreateToolBar()

        self.CreateStatusBar()

        self.createMenubar()

        self.Show(True)

        self.ldapconfig = self.configLdap()

        self.autoyastconfig = self.configAutoyast()

        self.checkConfig()

        self.configureInit = 1

        self.serverInit = 1



    def createFilemenu(self):

        """Create the File menu."""

        self.filemenu = wx.Menu()

        self.filemenu.Append(ID_CONFIG,"&Configure"," Configure...")

        wx.EVT_MENU(self, ID_CONFIG, self.configure)

        self.filemenu.Append(ID_SERVER,"&Get Serverlist"," Show a list of available server...")

        wx.EVT_MENU(self, ID_SERVER, self.buildServerList)

        self.filemenu.AppendSeparator()

        self.filemenu.Append(ID_EXIT,"E&xit"," Terminate the program...")

        wx.EVT_MENU(self, ID_EXIT, self.onExit)



    def createHelpmenu(self):

        """Create the Help menu"""

        self.helpmenu = wx.Menu()

        self.helpmenu.Append(ID_ABOUT, "&About"," Information about this program")

        wx.EVT_MENU(self, ID_ABOUT, self.onAbout)



    def createMenubar(self):

        """Create the menubar with its menus"""

        # create the file menu

        self.createFilemenu()

        # create the help menu

        self.createHelpmenu()

        self.menuBar = wx.MenuBar()

        # add the menus to the MenuBar

        self.menuBar.Append(self.filemenu,"&File")

        self.menuBar.Append(self.helpmenu,"&Help")

        # add the MenuBar to the Frame content

        self.SetMenuBar(self.menuBar)

def __configureInit(self):

        """Initialize the configure panel"""  

        self.configureInit = 0

        width = 250

        

        base = wx.StaticText(self.pConfig, -1, "ayBaseconfig:")

        baseconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["baseconfig"], size=(width, -1))

        baseconf.SetInsertionPoint(0)

        

        server = wx.StaticText(self.pConfig, -1, "ayServer:")

        serverconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["server"], size=(width, -1))

        serverconf.SetInsertionPoint(0)

        

        hw = wx.StaticText(self.pConfig, -1, "ayHardwarepool:")

        hwconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["hardwarepool"], size=(width, -1))

        hwconf.SetInsertionPoint(0)

        

        report = wx.StaticText(self.pConfig, -1, "ayReport:")

        reportconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["report"], size=(width, -1))

        reportconf.SetInsertionPoint(0)

        

        security = wx.StaticText(self.pConfig, -1, "aySecurity:")

        securityconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["security"], size=(width, -1))

        securityconf.SetInsertionPoint(0)

        

        software = wx.StaticText(self.pConfig, -1, "aySoftware:")

        softwareconf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["software"], size=(width, -1))

        softwareconf.SetInsertionPoint(0)

        

        x11 = wx.StaticText(self.pConfig, -1, "ayX11Conf:")

        x11conf = wx.TextCtrl(self.pConfig, -1, self.autoyastconfig["x11conf"], size=(width, -1))

        x11conf.SetInsertionPoint(0)

        

        self.sConfig.Add(base, (1,0))

        self.sConfig.Add(baseconf, (1,1))

        

        self.sConfig.Add(server, (2,0))

        self.sConfig.Add(serverconf, (2,1))

        

        self.sConfig.Add(hw, (3,0))

        self.sConfig.Add(hwconf, (3,1))

        

        self.sConfig.Add(report, (4,0))

        self.sConfig.Add(reportconf, (4,1))

        

        self.sConfig.Add(security, (5,0))

        self.sConfig.Add(securityconf, (5,1))

        

        self.sConfig.Add(software, (6,0))

        self.sConfig.Add(softwareconf, (6,1))

        

        self.sConfig.Add(x11, (7,0))

        self.sConfig.Add(x11conf, (7,1))

        

        self.pConfig.SetSizerAndFit(self.sConfig)

        self.sConfig.Layout()



    def buildServerList(self, event):

        """Get a list of configured server to create the AutoYaST XML file"""

        

        if ( self.serverInit == 1 ):

            self.__serverInit()

        

        self.sConfig.Show(self.pConfig,show=False,recursive=False)

        self.sConfig.Layout()

        self.sServer.Show(self.pServer,show=True,recursive=False)

        self.sServer.Layout()

            

    def __serverInit(self):

        """Initialize the server panel"""

        self.serverInit = 0

        

        # radio boxes for the different server

        self.selectedServer = 0

        self.serverList = self.getvalue(self.ldapsearch(self.ldapconfig["host"],self.autoyastconfig["server"],"cn=*"),"cn")

        self.serverBox = wx.RadioBox(self.pServer, 10, "Choose Server:", wx.DefaultPosition, wx.DefaultSize, self.serverList, 1, wx.RA_SPECIFY_COLS)

        self.serverBox.SetToolTip(wx.ToolTip("Choose a server to build a autoyast.xml file for"))

        self.Bind(wx.EVT_RADIOBOX, self.evtRadioBox, self.serverBox)



        # button to choose the server

        self.create = wx.Button(self.pServer, 20,"Build autoyast.xml file")

        self.Bind(wx.EVT_BUTTON, self.evtChooseServer, self.create)



        # logger to show events

        self.logger = wx.TextCtrl(self.pServer,30, "", size = (200,100), style = wx.TE_MULTILINE | wx.TE_READONLY)

        self.logger.SetToolTip(wx.ToolTip("This logger shows events."))

        

        self.sServer.Add(self.serverBox, (1,0))

        self.sServer.Add(self.create, (2,0))

        self.sServer.Add(self.logger, (1,1), (2,1), wx.EXPAND)

        

        self.pServer.SetSizerAndFit(self.sServer)

        self.sServer.Layout()
Wenn ich über den Button das Server-Panel aufrufe und dann das Configure-Panel, dann blendet sich das erste aus und das zweite ein. Andersherum funktioniert es leider nicht.
Hat jemand eine Idee?

Danke schon mal im Voraus.

Tobias
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Da du bis jetzt keine Antwort erhalten hast, und ich mich mit
Sizern auch nicht so auskenne, würde ich an deiner Stelle
die wxPython mailing list probieren.

Es wäre auch vorteilhaft, wenn du ein komplettes lauffähiges Programm
(Sample) liefern könntest, das so kurz wie möglich ist, und
dein Problem zeigt.

Sorry for not helping much :roll:
tobias.vdk
User
Beiträge: 19
Registriert: Mittwoch 23. November 2005, 16:51

So hier ist ein kleines Beispiel, bei dem das Ausblenden des Panels nicht funktioniert:

Code: Alles auswählen

import os
import wx

ID_CONFIG=101
ID_SERVER=102
ID_EXIT=110
ID_ABOUT=301

class Application(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "createXML", size = (600,500))
        self.pServer = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)
        self.pConfig = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)
        space = 5
        self.sServer = wx.GridBagSizer(space, space)
        self.sConfig = wx.GridBagSizer(space, space)
        self.sServer.AddGrowableCol(1)
        self.sConfig.AddGrowableCol(1)
        self.pServer.SetSizerAndFit(self.sServer)
        self.pConfig.SetSizerAndFit(self.sConfig)
        self.CreateToolBar()
        self.CreateStatusBar()
        self.createMenubar()
        self.Show(True)
        self.configureInit = 1
        self.serverInit = 1

    def createFilemenu(self):
        """Create the File menu"""
        self.filemenu = wx.Menu()
        self.filemenu.Append(ID_CONFIG,"&Preferences"," Show/change preferences...")
        wx.EVT_MENU(self, ID_CONFIG, self.configure)
        self.filemenu.Append(ID_SERVER,"&Get Serverlist"," Show a list of available server...")
        wx.EVT_MENU(self, ID_SERVER, self.buildServerList)
        self.filemenu.AppendSeparator()
        self.filemenu.Append(ID_EXIT,"E&xit"," Terminate the program...")
        wx.EVT_MENU(self, ID_EXIT, self.onExit)

    def createHelpmenu(self):
        """Create the Help menu"""
        self.helpmenu = wx.Menu()
        self.helpmenu.Append(ID_ABOUT, "&About"," Information about this program")
        wx.EVT_MENU(self, ID_ABOUT, self.onAbout)

    def createMenubar(self):
        """Create the menubar with its menus"""
        # create the file menu
        self.createFilemenu()
        # create the help menu
        self.createHelpmenu()
        self.menuBar = wx.MenuBar()
        # add the menus to the MenuBar
        self.menuBar.Append(self.filemenu,"&File")
        self.menuBar.Append(self.helpmenu,"&Help")
        # add the MenuBar to the Frame content
        self.SetMenuBar(self.menuBar)

    def onAbout(self,event):
        """Create a message dialog box """
        d= wx.MessageDialog( self, " About this program", " About createXML ", wx.OK)
        # Shows it
        d.ShowModal()
        # finally destroy it when finished.
        d.Destroy()

    def onExit(self, event):
        """Close the frame"""
        self.Close(True)

    def configure(self, event):
        """Configure the application"""   
        if ( self.configureInit == 1 ):
            self.__configureInit()
    
        self.sServer.Show(self.pServer,show=False,recursive=False)
        self.sServer.Layout()
        self.sConfig.Show(self.pConfig,show=True,recursive=False)
        self.sConfig.Layout()

    def __configureInit(self):
        """Initialize the configure panel"""  
        self.configureInit = 0
        width = 400

        self.ldapText = wx.StaticText(self.pConfig, -1, "LDAP configuration")        
        self.host = wx.StaticText(self.pConfig, -1, "LDAP Server IP:")
        self.hostconf = wx.TextCtrl(self.pConfig, -1, "192.168.0.1", size=(width, -1))
        self.hostconf.SetInsertionPoint(0)
       
        self.sConfig.Add(self.ldapText, (1,1))
        self.sConfig.Add(self.host, (2,1))

        self.sConfig.Add(self.hostconf, (2,2))
    
        self.pConfig.SetSizerAndFit(self.sConfig)
        self.sConfig.Layout()

    def buildServerList(self, event):
        """Show a list of avaiable server to create the AutoYaST XML file"""

        if ( self.serverInit == 1 ):
            self.__serverInit()

        self.sConfig.Show(self.pConfig,show=False,recursive=False)
        self.sConfig.Layout()
        self.sServer.Show(self.pServer,show=True,recursive=False)
        self.sServer.Layout()

    def __serverInit(self):
        """Initialize the server panel"""
        self.serverInit = 0

        # radio boxes for the different server
        self.selectedServer = 0
        self.serverList = ("server1", "server2", "server3")
        self.serverBox = wx.RadioBox(self.pServer, 10, "Choose Server:", wx.DefaultPosition, wx.DefaultSize, self.serverList, 1, wx.RA_SPECIFY_COLS)
        self.serverBox.SetToolTip(wx.ToolTip("Choose a server to build a autoyast.xml file for"))
        self.Bind(wx.EVT_RADIOBOX, self.evtRadioBox, self.serverBox)

        # button to choose the server
        self.create = wx.Button(self.pServer, 20,"Build autoyast.xml file")
        self.Bind(wx.EVT_BUTTON, self.evtChooseServer, self.create)

        # logger to show events
        self.logger = wx.TextCtrl(self.pServer,30, "", size = (300,200), style = wx.TE_MULTILINE | wx.TE_READONLY)
        self.logger.SetToolTip(wx.ToolTip("This logger shows events."))

        self.sServer.Add(self.serverBox, (1,1))
        self.sServer.Add(self.create, (2,1))
        self.sServer.Add(self.logger, (1,2), (2,1), wx.EXPAND)

        self.pServer.SetSizerAndFit(self.sServer)
        self.sServer.Layout()

    def evtRadioBox(self, event):
        """Get the number of server"""
        self.selectedServer = event.GetInt()

    def evtChooseServer(self, event):
        pass

app = wx.PySimpleApp()
frame = Application()
app.MainLoop()
Vielleicht kann ja jemand anhand dieses Beispiels den Fehler finden.
Vielen Dank für eure Mühe.

Tobias
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo, nachdem ich ein bisschen herumprobiert habe und
mir auch das GridBagSizer Demo angesehen habe:

das Panel selbst ist ja kein Bestandteil des Sizers.
mit den Methoden Hide des Sizers kann man nur Elemente
verstecken, die auch mit Add hinzugefügt wurden.

Ich hoffe ich habe mich nicht geirrt. :)
Also austauschen des codes mit den beiden Methoden unten
läuft bei mir.
(Panels selber zeigen oder verstecken)

Code: Alles auswählen

    def buildServerList(self, event):
        """Show a list of avaiable server to create the AutoYaST XML file"""

        if ( self.serverInit == 1 ):
            self.__serverInit()

        self.pConfig.Hide()
        self.pServer.Show()

    def configure(self, event):
        """Configure the application"""  
        if ( self.configureInit == 1 ):
            self.__configureInit()
   
        #self.sServer.Show(self.pServer,show=False,recursive=False)
        #self.sServer.Layout()
        self.pServer.Hide()
        self.pConfig.Show()
Zu den Sizern selber kann ich nichts sagen, aber mir scheint,
dass dieser nicht so funktioniert wie er sollte.
(Es ist nichts "growable"). Vielleicht hilft hier wieder, das Demo
und den zugehörigen Code anzusehen, weiter.

Und auch die kürzlich kreierte Wiki Page: ;)

http://wiki.wxpython.org/index.cgi/wxGridBagSizer
tobias.vdk
User
Beiträge: 19
Registriert: Mittwoch 23. November 2005, 16:51

Special Thanks @Francesco!

Mit den beiden Methoden klappts. Da war wohl ein Denkfehler meinerseits dran schuld.

Tobias
pascalsv
User
Beiträge: 16
Registriert: Samstag 7. Januar 2006, 15:45

Hallo zusammen,

ich habe ein ähnliches Problem, wenn ich Objekte gleichen Namens in den unterschiedlichen Panels verwende. Diese verändern dann nicht ihren Text z.B. Hängt das mit der Deklaration unter "self" zusammen? Warum deklariert ihr diese Textfelder u.ä. eigentlich immer mit "self". Würden sie ohne "self" denn nicht zerstört werden, wenn das Panel gewechselt wird? Dann könnte ich die gleichen Bezeichnungen in allen Paneln verwenden...

Danke für jeden Tip,

Pascal
Life is short - don't buy green bananas...
Antworten