wxGlade created a simple Frame with a panel a sizer and 3 wxControls ,
saticText, TextCtrl, and a Button.

The resulting code works fine.

Now the problem.
I wish to make a separate class derrived from wxPanel that has the sized
and controls as above.  It jusst won't work


<code id="gladeGen" class="works_ok">
#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-
# generated by wxGlade 0.4cvs on Thu Oct 11 13:26:19 2007

import wx

class MyFrameOne(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrameOne.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel = wx.Panel(self, -1)
        self.staticbox = wx.StaticBox(self.panel, -1, "StaticBox")
        self.label = wx.StaticText(self.panel, -1, "Field Name")
        self.textBox = wx.TextCtrl(self.panel, -1, "Field Value")
        self.button = wx.Button(self.panel, -1, "Edit")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrameOne.__set_properties
        self.SetTitle("frame_1")
        self.label.SetMinSize((-1, 15))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrameOne.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
        sizer.Add(self.label, 0, wx.ALL, 3)
        sizer.Add(self.textBox, 0, wx.ALL, 3)
        sizer.Add(self.button, 0, wx.ALL, 3)
        self.panel.SetAutoLayout(True)
        self.panel.SetSizer(sizer)
        sizer.Fit(self.panel)
        sizer.SetSizeHints(self.panel)
        sizer_1.Add(self.panel, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        self.Layout()
        # end wxGlade

# end of class MyFrameOne

## modified from BoaApp
class App(wx.App):
        def OnInit(self):
                wx.InitAllImageHandlers()
                self.main = MyFrameOne(None)
                self.main.Show()
                self.SetTopWindow(self.main)
                return True

def main():
        application = App(0)
        application.MainLoop()

if __name__ == '__main__':
        main()

</code>

<code id="modifiedFromGlade" class="fails">
#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-
#The commented out code from MyFrame was moved to class Panel \
# and appropriately modified by changing self.panel to self etc

import wx

class MyFrameTwo(wx.Frame):
        def __init__(self, *args, **kwds):
                # begin wxGlade: MyFrameTwo.__init__
                kwds["style"] = wx.DEFAULT_FRAME_STYLE
                wx.Frame.__init__(self, *args, **kwds)
##              self.panel = panel(self, -1)
                self.panel = Panel(self, -1)
                self.__set_properties()
                self.__do_layout()
                # end wxGlade

        def __set_properties(self):
                # begin wxGlade: MyFrameTwo.__set_properties
                self.SetTitle("frame_1")
                self.label.SetMinSize((-1, 15))
                # end wxGlade

        def __do_layout(self):
                # begin wxGlade: MyFrameTwo.__do_layout
                sizer_1 = wx.BoxSizer(wx.VERTICAL)
##              sizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
##              sizer.Add(self.label, 0, wx.ALL, 3)
##              sizer.Add(self.textBox, 0, wx.ALL, 3)
##              sizer.Add(self.button, 0, wx.ALL, 3)
####            self.panel.SetAutoLayout(True)
##              self.panel.SetSizer(sizer)
##              sizer.Fit(self.panel)
##              sizer.SetSizeHints(self.panel)
                sizer_1.Add(self.panel, 1, wx.EXPAND, 0)
                self.SetAutoLayout(True)
                self.SetSizer(sizer_1)
                sizer_1.Fit(self)
                sizer_1.SetSizeHints(self)
                self.Layout()
                # end wxGlade

# end of class MyFrameTwo


class Panel (wx.Panel):
        def __init__(self, *args, **kwds):
                self.staticbox = wx.StaticBox(self, -1, "StaticBox")
                self.label = wx.StaticText(self, -1, "Field Name")
                self.textBox = wx.TextCtrl(self, -1, "Field Value")
                self.button = wx.Button(self, -1, "Edit")
                __doLayout()

        def __doLayout():
                sizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
                sizer.Add(self.label, 0, wx.ALL, 3)
                sizer.Add(self.textBox, 0, wx.ALL, 3)
                sizer.Add(self.button, 0, wx.ALL, 3)
                
                # maybe comment this and uncommennt  frame2's corresponding line
                panel.SetAutoLayout(True)
                
                self.SetSizer(sizer)
                sizer.Fit(self.panel)
                sizer.SetSizeHints(self.panel)
                

## modified from BoaApp
class App(wx.App):
        def OnInit(self):
                wx.InitAllImageHandlers()
                self.main = MyFrameTwo(None)
                self.main.Show()
                self.SetTopWindow(self.main)
                return True

def main():
        application = App(0)
        application.MainLoop()

if __name__ == '__main__':
        main()

</code>

<errorMessages>
 /home/xaos/xpy/cnc/i2g/prefDialog/test/frame2.py
Traceback (most recent call last):
 File "/home/xaos/xpy/cnc/i2g/prefDialog/test/frame2.py", line 82, in ?
main()
 File "~/xpy/cnc/i2g/prefDialog/test/frame2.py", line 78, in main
application = App(0)
 File
"/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line
7473, in __init__
self._BootstrapApp()
 File
"/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line
7125, in _BootstrapApp
return _core_.PyApp__BootstrapApp(*args, **kwargs)
 File "~/xpy/cnc/i2g/prefDialog/test/frame2.py", line 72, in OnInit
self.main = MyFrameTwo(None)
 File "~/xpy/cnc/i2g/prefDialog/test/frame2.py", line 13, in __init__
self.panel = Panel(self, -1)
 File "~/xpy/cnc/i2g/prefDialog/test/frame2.py", line 48, in __init__
self.staticbox = wx.StaticBox(self, -1, "StaticBox")
 File
"/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_controls.py",
line 990, in __init__
newobj = _controls_.new_StaticBox(*args, **kwargs)
TypeError: argument number 1: a 'wxWindow *' is expected, 'Panel' is
received
Script terminated.

</errorMessages>


It seems as though the complaint is that  a 'wxWindow *' is expected,
'Panel' is received
However, Panel IS a wx.Panel derivative which IS a wx.Window derivative!
Additionally, the methods in the code of Panel and MyFrameOne seem to be
identical.
I can't understand this. Anyone have any thoughts?

I'm using spe as an IDE

~S~

I taught myself everything I know about Python and wxPython in the lasst
week and I still don't know everything.


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to