Seite 1 von 1

onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 11:52
von joergimann
Hallo.

Ich habe folgenden Skript das einen Chart malt.
Nun wollte ich ein CrossHair hinzufügen.
Das funktioniert auch nur bei den MouseOver wird der Chart leider komplett gelöscht. Das liegt an dem dc.Clear()
doch auskommentieren geht nicht da sonst der ganze CHart schwarz wird weil immer ein neues CorssHeir gemalt wird.
Hat jemand evtl. eine Idee?

Code: Alles auswählen

class JS_LineChart(wx.Panel):
    def __init__(self, parent,*args):
        
        wx.Panel.__init__(self, parent,style=wx.FULL_REPAINT_ON_RESIZE)
        self.SetBackgroundColour('WHITE')
        wx.EVT_PAINT(self,self.JS_OnPaint)
        self.Bind(wx.EVT_PAINT, lambda event: self.JS_OnPaint(args))
        self.Bind(wx.EVT_MOTION, self.onMouseOver)

        self.Refresh() 

    def onMouseOver(self, event):
          (x, y) = event.GetPosition()
          dc=wx.ClientDC(self)
          dc.Clear()
          dc.SetPen(wx.Pen(wx.Color(0, 0, 0), 1, wx.DOT))
          dc.CrossHair(x, y)
          


    def JS_OnPaint(self, event):

          print 'event',event
          self.Refresh()
          dc=wx.PaintDC(self)
          dc.Clear()
          dc.SetDeviceOrigin(30,170)
          dc.SetAxisOrientation(True, True)
          dc.SetPen(wx.Pen('BLACK'))
          dc.DrawRectangle(0, 0, 560,180)
          font =  dc.GetFont()
          font.SetPointSize(8)
          dc.SetFont(font)
          dc.SetPen(wx.Pen('#0AB1FF'))
          font =  dc.GetFont()
          font.SetPointSize(8)
          dc.SetFont(font)
          zeile=0

Re: onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 12:52
von BlackJack
@joergimann: Entweder Du zeichnest immer wieder den kompletten Chart neu, oder Du verwendest kein `Clear()` sondern löst das anders. Zum Beispiel in dem Du Dir merkst was unter dem Fadenkreuz ist und statt alles zu löschen nur diesen Teil wieder überschreibst.

Das Bind von JS_OnPaint() ist eigenartig — Du ersetzt mit dem ``lambda`` sozusagen das Ereignisobjekt durch `args`, der Parameter bei ``def JS_OnPaint(…`` heisst aber weiterhin `event` obwohl da keins mehr übergeben wird.

Re: onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 13:13
von joergimann
Kann ich denn alle Objekte vom Chart aufheben
z.B.
for child in self:
.......

und dann neu zeichnen?

Wie zeichne is es denn neu?

Re: onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 13:26
von BlackJack
@joergimann: Ich verstehe die Frage nicht so ganz. Du hast doch eine `JS_OnPaint()`-Methode die den Chart neu zeichnet!?

Re: onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 13:44
von joergimann
Ja habe ich.
ABer die OnPaint funktion braucht ca. 2 Minuten :-(

Re: onMouseOver löscht den Chart

Verfasst: Dienstag 7. Oktober 2014, 15:03
von BlackJack
@joergimann: Dann muss man wohl eine Alternative finden. Wobei das generell ein Problem ist, denn die Methode kann ja auch ausgeführt werden wenn der Fensterinhalt von einem anderen Fenster verdeckt wurde und wieder sichtbar wird. Da sind zwei Minuten deutlich zu viel.