2011-01-10 14 views
0

私はサブクラス化したwx.Dialogを持っています。このダイアログでは、DCで私自身の絵を実行します&私は自分のwx.Timerを持っていて、100クロックステップごとにループします。wx.Timerを使用すると、常にwx.EVT_PAINT msg&not wx.EVT_TIMERが送信されます

ここで、self.timer.Start(100)と言ってwx.Timerを起動すると、100クロックステップごとに正しくループしますが、100クロックステップごとにwx.EVT_PAINT msgがダイアログに送信されますwx.EVT_TIMER msgではないのですか?あなたは、文字列常に(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

Windowsの場合は、EVT_PAINTハンドラにwx.PaintDCを作成しないという問題があります。制御がそのイベントを送信した後に制御を戻すと、ウィンドウが無効化された領域をまだ持っていることが検出され、優先度の高い別のペイントイベントがすぐに送信されます。これは他のすべてのイベントを餓死させるので、あなたの例で送られました。

あなたがWindowsにいない場合は、詳細をお知らせください。

関連する問題