使用wx.Timer,始终发送wx.EVT_PAINT消息&不是wx.EVT_TIMER

时间:2011-01-10 02:13:22

标签: python wxpython

我有一个wx.Dialog,我有子类。在这个对话框中,我在DC& amp;我也有自己的wx.Timer,它每100个时钟步进一次循环。

现在发生的事情是当我启动我的wx.Timer时说,self.timer.Start(100),它正确地每100个时钟步进循环但是它每隔100个时钟将wx.EVT_PAINT消息发送到对话框步骤不是wx.EVT_TIMER消息?

从下面的示例中可以很容易看到&如果您运行它,您将看到字符串“Got Paint”始终打印&永远不会打印“Got Timer”(永远不会收到wx.EVT_TIMER事件?)

为什么这样做?我该如何解决?

import wx

class dlg( wx.Dialog ):

    def __init__( self, _parent ):

        wx.Dialog.__init__( self, parent=_parent, id=wx.ID_ANY )

        self.Show()

        self.w = wx.Timer( self )
        self.Bind( wx.EVT_TIMER, self.on_timer, self.w )
        self.Bind( wx.EVT_PAINT, self.on_paint )
        self.w.Start(100)


    def on_timer( self, event ):

        print "Got Timer"
        raw_input()

    def on_paint( self, event ):

        print "Got Paint"
        raw_input()



class Frame( wx.Frame ):

    def __init__( self, _parent ):

        wx.Frame.__init__( self, parent=_parent, id=wx.ID_ANY )

        self.Bind( wx.EVT_CLOSE, self.on_close )

        self.w = dlg( self )


    def on_close( self, event ):

        self.Close( True )
        self.Destroy()



if __name__ == "__main__":

    app   = wx.App(False)
    frame = Frame( None )

    frame.Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:1)

如果您使用的是Windows,则问题是您没有在EVT_PAINT处理程序中创建wx.PaintDC。当控件在发送该事件后返回到寡妇时,它会感觉到窗口仍然存在无效区域,因此它会立即发送另一个具有更高优先级的绘制事件,这最终会使所有其他事件挨饿,因此看起来没有计时器事件正在在你的例子中发送。

如果您不在Windows上,请提供更多详细信息。