wx.Treebook.InsertSubPage

Plattformunabhängige GUIs mit wxWidgets.
Antworten
okrol
User
Beiträge: 1
Registriert: Freitag 20. Juli 2012, 10:11

Hallo Allerseits,

ich möchte eine GUI zur Definition von Fuzzy-Systemen programmieren. Diese System-Definition soll in fünf Schritten aufgebaut sein, wobei jeder Schritt sozusagen durch eine Hauptseite des Treebooks repräsentiert wird. Es gibt also eine Eingangsseite, eine Seite zur Definition der Eingangsvariablen, eine Seite zur Definition der Ausgangsvariablen, eine Seite für die Regelbasis und schließlich eine Seite um das Gesamtsystem zusammenzufassen.
So viel zum Rahmen.
Jetzt zu meinem Problem: Auf der Eingangsseite (Klasse DescriptionPage) sollen allgemeine Angaben zum Fuzzy-Problem gemacht werden. Im Moment werden dort nur der System-Name, und die Anzahl der Ein- und Ausgangsvariablen definiert. Entsprechend dieser Anzahlen werden bei Drücken des Enter-Buttons Subpages (Methode OnSave in der Klasse DescriptionPage) unter den Hauptseiten für die Ein- und Ausgangsvariablen (Klasse InputVarPage/OutputVarPage) angelegt. Das heißt eine Subpage repräsentiert eine Ein- oder Ausgangsvariable. Die SubPages sind auch als Klassen definiert (InVarSubPage/OutVarSubPage). Das alles funktioniert auch noch ganz gut.
Jetzt möchte ich auf diesen Subpages aber die jeweilige Variable genauer spezifizieren und das soll über entsprechende Widgets geschehen. Also hier sollen bspw. der Typ der Membershipfunction, der Definitionsbereich, die Anzahl der linguistischen Varaiablen usw. definiert und dieser Variablen zugeordnet werden. Das klappt aber nicht. Versuche ich z.B. nur die Hintergrundfarbe mit Hilfe von self.SetBackgroundColour() für die SubPages in der entsprechenden Klasses zu definieren, dann kommt zwar keine Fehlermeldung, aber es hat auch keinen Effekt. Wende ich die SetBackgroundColour-Methode in OnSave an, dann werden die Panels der SubPages zwar mit der entsprechenden Farbei eingefärbt, aber die haben dann alle die gleiche Farbe, also egal ob Ein- oder Ausgangsvariable. Und das soll so auch nicht ein. Eigentlich dachte ich wird das Ganze in der Klasse für die SubPages geregelt (so wie unten im Code realisiert), aber das funktioniert wie gesagt nicht. Es passiert gar nichts und eigentlich sollten alle Subapages für die Eingangsvariablen blau und SubPages für die Ausgnagsvariablen orange hinterlegt werden. Was habe ich da falsch gemacht???
Ich hoffe, mir kann hier jemand helfen. Danke schon mal im Voraus für Eure Mühen.

Hier ist nun der Code

Code: Alles auswählen

import wx
from wx.lib.pubsub import Publisher
#import ColorPanel


PageList = [ 'Description','Input Variables' , 'Output Variables', 'Rule Base', 'Summarize System'] 
PageBGColor = "Cornflower Blue"
no_invars=1
no_outvars=1

class InVarSubPage(wx.Panel):
    def __init__(self, ip, *args,**kwargs):
        self.ip = ip
        wx.Panel.__init__(self, self.ip, *args,**kwargs)
        self.SetBackgroundColour('Blue')

class OutVarSubPage(wx.Panel):
    def __init__(self, op, *args,**kwargs):
        self.op = op
        wx.Panel.__init__(self, self.op, *args,**kwargs)
        self.SetBackgroundColour('Orange')

class DescriptionPage(wx.Panel):
    def __init__(self, tb, *args,**kwargs):
        wx.Panel.__init__(self, tb, *args,**kwargs)
        self.tb=tb
        self.SetBackgroundColour(PageBGColor)
        self.title='Description'
       
        self.text2 = wx.StaticText(self,-1, 'Description', pos=(20,50))
        self.SystemsName = wx.TextCtrl(self,-1,'Fuzzy System I', pos=(170, 50), size=(200,20))
        self.text2.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD)) 
        #self.Bind(wx.EVT_TEXT_ENTER, self.GetSystemsName, self.SystemsName)
         
        self.text3 = wx.StaticText(self,-1, 'Number of Input Variables', pos=(20,80))
        self.no_invars= wx.TextCtrl(self,-1,"", pos=(250, 80), size=(200,20),style=0)
        self.text3.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))         
       # self.Bind(wx.EVT_TEXT, self.NoVars, self.no_invars)
                   
        self.text4 = wx.StaticText(self,-1, 'Number of Output Variables', pos=(20,110))
        self.no_outvars= wx.TextCtrl(self,-1, "", pos=(250, 110), size=(200,20),style=0)
        self.text4.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))         
       # self.Bind(wx.EVT_TEXT, self.NoVars, self.no_outvars)
                  
        btn = wx.Button(self, label = "Enter", pos=(50, 200))
        btn.Bind(wx.EVT_BUTTON, self.OnSave)
        
    def OnSave(self, event):
        """
        Send a message and close frame
        """
        msg1 = self.no_invars.GetValue()
        msg2 = self.no_outvars.GetValue()
        Publisher().sendMessage(("show.mainpanelI"), msg1)
        Publisher().sendMessage(("show.mainpanelO"), msg2)
        self.tb.noi = str(msg1)
        self.tb.noo = str(msg2)
        self.tb.ip.lo_invars=[]
        self.tb.op.lo_outvars=[]        
        for i in range(int(self.tb.noi)):
            title = 'Input Variable_'+str(i+1)
            subpage = InVarSubPage(self.tb.ip)
            subpage.title = title
            self.tb.ip.lo_invars.append(subpage)
            self.tb.InsertSubPage(1, self.tb.ip.lo_invars[i], title)

        for k in range(int(self.tb.noo)):
            title = 'Output Variable_'+str(k+1)
            subpage = OutVarSubPage(self.tb.GetPage(2+int(self.tb.noi)))
            subpage.title = title
            self.tb.op.lo_outvars.append(subpage)
            self.tb.InsertSubPage(2+int(self.tb.noi), self.tb.op.lo_outvars[k], title)

        self.Close()
        
    def GetSystemsName(self, event):
        self.desc = str(event.GetString())
        print self.desc
                
    def NoVars(self, event):
        newval= event.GetString()
        if newval=='':
            self.n=1
        else:
            self.n=int(newval)
            

        
class InputVarPage(wx.Panel):
    def __init__(self, *args,**kwargs):
           wx.Panel.__init__(self, *args,**kwargs)
           self.SetBackgroundColour(PageBGColor)
           self.title='Input Variables'
           
           Publisher().subscribe(self.showIPanel, ("show.mainpanelI"))
           
           self.text5 = wx.StaticText(self,-1, 'Number of Input Variables', pos=(20,110))
           self.pubsubTextI = wx.TextCtrl(self, value="", pos=(250, 110), size=(200,20),style=0)
           self.text5.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))         
           #self.Bind(wx.EVT_TEXT, self.NoVars, self.no_outvars)
            
    def showIPanel(self, msg1):
        """
        Shows the frame and shows the message sent in the
        text control
        """
        self.pubsubTextI.SetValue(msg1.data)
        Ipanel = self.GetParent()
        Ipanel.Show()
        
        self.ivar = self.pubsubTextI.SetValue(msg1.data)
        print self.ivar   
                
class OutputVarPage(wx.Panel):
    def __init__(self, *args,**kwargs):
           wx.Panel.__init__(self, *args,**kwargs)
           self.SetBackgroundColour(PageBGColor)
           self.title='Output Variables'
           
           Publisher().subscribe(self.showOPanel, ("show.mainpanelO"))
           
           self.text6 = wx.StaticText(self,-1, 'Number of Output Variables', pos=(20,110))
           self.pubsubTextO = wx.TextCtrl(self, value="", pos=(250, 110), size=(200,20),style=0)
           self.text6.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))         
           #self.Bind(wx.EVT_TEXT, self.NoVars, self.no_outvars)
           
    def showOPanel(self, msg2):
        """
        Shows the frame and shows the message sent in the
        text control
        """
        self.pubsubTextO.SetValue(msg2.data)
        Opanel = self.GetParent()
        Opanel.Show()
          
class RulePage(wx.Panel):
    def __init__(self, *args,**kwargs):
           wx.Panel.__init__(self, *args,**kwargs)
           self.SetBackgroundColour(PageBGColor)
           self.title='Rule Base'
           
class FinishSystemPage(wx.Panel):
    def __init__(self, *args,**kwargs):
           wx.Panel.__init__(self, *args,**kwargs)
           self.SetBackgroundColour(PageBGColor)
           self.title='Complete System'
           
class TestTreebook(wx.Frame): 
    def __init__(self, parent, id, title):  
        self.frame = wx.Frame.__init__(self, parent, id, title, size= (1000,600)) 
        self.tb = wx.Treebook(self, -1, style = wx.BK_DEFAULT)
        self.tb.noi=None
        self.tb.noo=None
        
        self.tb.stb=[]
        for item in PageList:
            if item =='Description':
                self.tb.dp = DescriptionPage(self.tb, -1)
                self.tb.stb.append(self.tb.AddPage(self.tb.dp, item))
                
            elif item =='Input Variables':
                self.tb.ip = InputVarPage(self.tb, -1)
                self.tb.stb.append(self.tb.AddPage(self.tb.ip, item))

            elif item =='Output Variables':
                self.tb.op = OutputVarPage(self.tb, -1)
                self.tb.stb.append(self.tb.AddPage(self.tb.op, item))
                
            elif item =='Rule Base':
                self.tb.rp = RulePage(self.tb, -1)
                self.tb.stb.append(self.tb.AddPage(self.tb.rp, item))
                
            elif item == 'Summarize System':
                self.tb.fp=FinishSystemPage(self.tb, -1)
                self.tb.stb.append(self.tb.AddPage(self.tb.fp, item))
        
        self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.ShowCurrentPage)

    def ShowCurrentPage(self, event):
        self.sel = event.GetSelection()
        self.cp = self.tb.GetCurrentPage()
        print(self.cp.title)        
        
    
class PyFuzzyTK(wx.App): 

    def OnInit(self): 
        self.frame = TestTreebook(parent = None, id = -1, title='Fuzzy Toolkit') 
        self.frame.Center() 
        self.frame.Show() 
        return True 

if __name__ == '__main__': 
    app = PyFuzzyTK() 
    app.MainLoop() 

Antworten