By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,018 Members | 1,204 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,018 IT Pros & Developers. It's quick & easy.

wxPython: panel not fully painted

P: n/a
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.

Jan 24 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On 24 Jan 2007 13:35:51 -0800, ci*******@yahoo.com <ci*******@yahoo.comwrote:
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).
Jan 24 '07 #2

P: n/a
On Wed, 24 Jan 2007 13:35:51 -0800, citronelu 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.
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
Jan 25 '07 #3

P: n/a
Thank you.

Jan 28 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.