[Steve]
> Well, I've verified that it's a stream of EVT_PAINT events that are
causing
> the high utilisation (I just registered an event handler that printed a
> message). However, I'm not sure what the protocol for switching the
events
> off might be - when EVT_PAINT calls the event's .Skip() method the CPU
hits
> the stop at 100%, but I only see two EVT_PAINT events. When I *don't*
call
> it I see a continuous stream of EVT_PAINT events and the window doesn't
even
> get completely drawn.
[Robin]
Calling evt.Skip() allows the default handler to run, which does create
the
wxPaintDC, so the problem doesn't happen.
Well, this is the smallest program I've been able to build to show the
problem. Running it with 2.3.3pre2 pegs the CPU at 100%, but if I run it and
click the button I only see two EVT_PAINTs. Without the evt.Skip() call the
CPU still pegs, but I see a continuous stream of EVT_PAINTs and the window
doesn't complete its drawing. Am I doing something wrong? Would moving to
2.3.3pre3 help?
···
#----------------------------------------------------------------------
# A very simple wxPython example. Just a wxFrame, wxPanel,
# wxStaticText, wxButton, and a wxBoxSizer, but it shows the basic
# structure of any wxPython application.
#----------------------------------------------------------------------
from wxPython.wx import *
import sys
class MyFrame(wxFrame):
"""
This is MyFrame. It just shows a few controls on a wxPanel,
and has a simple menu.
"""
def __init__(self, parent, title):
wxFrame.__init__(self, parent, -1, title, size=(350, 200))
menuBar = wxMenuBar()
menu = wxMenu()
menu.Append(101, "E&xit\tAlt-X", "Exit demo")
EVT_MENU(self, 101, self.OnButton)
menuBar.Append(menu, "&File")
self.SetMenuBar(menuBar)
panel = wxPanel(self, -1)
if wxPlatform == "__WXMAC__":
text = wxStaticText(panel, -1,
"Hello World!\nWhere is my menu?")
else:
text = wxStaticText(panel, -1, "Hello World!")
text.SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD))
text.SetSize(text.GetBestSize())
btn = wxButton(panel, -1, "Close")
btn.SetDefault()
sizer = wxBoxSizer(wxVERTICAL)
sizer.Add(text, 0, wxALL, 10)
sizer.Add(btn, 0, wxALL, 10)
panel.SetSizer(sizer)
panel.SetAutoLayout(true)
panel.Layout()
EVT_BUTTON(self, btn.GetId(), self.OnButton)
EVT_PAINT(self, self.doNothing)
def doNothing(self, evt):
print "Paint called"
sys.stdout.flush()
evt.Skip()
def OnButton(self, evt):
"""Event handler for the button click."""
print "OnButton"
self.Close()
app = wxPySimpleApp()
frame = MyFrame(None, "Simple wxPython App")
frame.Show(true)
app.MainLoop()
regards
Steve
--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------