wxPython: panel not fully painted

C

citronelu

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.
 
C

Chris Mellon

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).
 
M

Morpheus

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.

Consider using sizers, you'll need them anyway. They do such things for
you, and many other things too.

The help file has a good chapter on this: Working with sizers.

Kind regards
Morpheus
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top