wxPython: panel not fully painted

Chris Mellon arkanes at gmail.com
Wed Jan 24 16:56:45 EST 2007


On 24 Jan 2007 13:35:51 -0800, citronelu at yahoo.com <citronelu at yahoo.com> wrote:
> Hi,
>
> I'm new to wxpython, and the following code is my first serious
> attempt:
>
>
> #~ start code
> import wx
>
> class MyPanel(wx.Panel):
>     def __init__(self, parent, id):
>         wx.Panel.__init__(self, parent, id)
>         self.parent = parent
>         button = wx.Button(self, -1, "Refresh")
>         button.SetPosition((100, 100))
>         button.SetFocus()
>
>         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
>
>     def OnCloseMe(self, event):
>         self.parent.f_redraw(self)
>         pass
>
>
> class MyFrame(wx.Frame):
>     def __init__(
>             self, parent, ID, title, pos=wx.DefaultPosition,
>             size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE
>             ):
>
>         wx.Frame.__init__(self, parent, ID, title, pos, size, style)
>
>     def f_redraw(self, kill_window):
>         kill_window.Destroy()
>         MyPanel(self, -1)
>         #~ self.SendSizeEvent()
>
>
> wxApp = wx.App()
> f = MyFrame(None, -1, "App Title")
> MyPanel(f, -1)
> f.Show()
> wxApp.MainLoop()
>
>
> #~ end code
>
>
> My problem is: when I press the "refresh" button, the new panel is
> painted only as a 20x20 pixels square on the top right side of the
> frame. If I resize the frame, the panel is repainted correctly (that's
> why I inserted the self.SendSizeEvent() line - commented above).
>
> Is there something I'm missing, or this is normal ?
>
> I'm using python 2.4.3 and wxpython 2.8.1.1 unicode, on WinXP SP2.
> Windows extensions are also installed.
>

This is expected. Note that your "redraw" is no such thing - you are
destroying the window and creating a new one.

A feature of the wx.Frame class is that if it has one and only one
child, that child is sized to fill the client area of the frame.
However, this sizing happens in response to size events of the frame
itself, so when you create the new panel, it is shown at its default
size until you resize the frame (or emulate resizing the frame via
SendSizeEvent).



More information about the Python-list mailing list