2017-08-06 12 views
0

次のコードは、「キャリブレーション」ボタンとキャンバスからなるウィンドウを作成することになっています。 「校正」ボタンをクリックすると、赤い点がキャンバス上のランダムな場所に再描画されるはずです。wxPython:パネル更新時にonPaintイベントが呼び出されない

代わりに、OnPaintイベントが最初に1回だけ呼び出され、それ以降は表示されないことがわかります。何が起きているのか?

import wx 
import datetime 
import threading 
import random 

class frmMain (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(839,553), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 
     self.pos = (300,100) 
     self.initGUI() 

    def initGUI(self): 
     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     topSizer = wx.BoxSizer(wx.HORIZONTAL) 

     buttonsSizer = wx.BoxSizer(wx.VERTICAL) 

     self.btnCalibrate = wx.Button(self, wx.ID_ANY, u"Calibrate", wx.DefaultPosition, wx.DefaultSize, 0) 
     buttonsSizer.Add(self.btnCalibrate, 0, wx.ALL, 5) 

     topSizer.Add(buttonsSizer, 0, wx.LEFT, 5) 

     sizeCanvas = wx.BoxSizer(wx.VERTICAL) 

     sizeCanvas.SetMinSize(wx.Size(600,600)) 

     self.panel=wx.Panel(self, size=(600,600)) 
     self.panel.SetBackgroundColour('white') 
     self.firstpoint=wx.Point(300,300) 
     self.secondpoint=wx.Point(400,400) 
     self.panel.Bind(wx.EVT_PAINT, self.onPaint) 

     sizeCanvas.Add(self.panel, 0, wx.ALIGN_LEFT, 5) 

     topSizer.Add(sizeCanvas, 1, wx.ALIGN_RIGHT, 5) 


     self.SetSizer(topSizer) 
     self.Layout() 

     self.Centre(wx.BOTH) 

     # Connect Events 
     self.btnCalibrate.Bind(wx.EVT_BUTTON, self.StartCalibrate) 
     self.Show(True) 

    def onPaint(self,event): 
     print "lalal" 
     dc = wx.WindowDC(self.panel) 
     color = wx.Colour(255,0,0) 
     b = wx.Brush(color) 

     dc.SetBrush(b) 
     dc.DrawCircle(self.pos[0], self.pos[1], 10) 

    def __del__(self): 
     pass 

    def StartCalibrate(self, event): 
     size = self.GetSize() 
     self.pos = (random.randrange(0, size[0] - 1, 1), random.randrange(0, size[1] - 1, 1)) 
     print "fixation at %d, %d" % (self.pos[0], self.pos[1]) 
     self.panel.Update() 
     event.Skip() 

if __name__ == "__main__": 
    app = wx.App() 
    frmMain(None) 
    app.MainLoop() 

答えて

1

Updateの代わりにRefreshを使用してください。 Updateは、ペンディングイベントがすぐに処理されるようにしますが、ペンディングイベントがない場合は何も実行されません。一方、Refreshは、paintイベントをウィジェットに送信します。

関連する問題