2017-08-06 1 views
0

Der folgende Code soll ein Fenster erstellen, das aus einer Schaltfläche "calibrate" und einer Zeichenfläche besteht. Wenn Sie auf die Schaltfläche "Kalibrieren" klicken, wird der rote Punkt an einer zufälligen Position auf der Leinwand neu gezeichnet.wxPython: onPaint-Ereignis bei Panel-Aktualisierung nicht aufgerufen

Stattdessen wird das OnPaint-Ereignis einmal aufgerufen, am Anfang und nicht danach. Irgendeine Idee was ist los?

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() 

Antwort

1

Verwenden Refresh statt Update. Update bewirkt, dass ausstehende Paint-Ereignisse sofort verarbeitet werden. Wenn jedoch keine Paint-Ereignisse ausstehen, wird nichts unternommen. Auf der anderen Seite bewirkt Refresh, dass ein Paint-Ereignis an das Widget gesendet wird.