onMouseOver löscht den Chart

Plattformunabhängige GUIs mit wxWidgets.
Antworten
joergimann
User
Beiträge: 14
Registriert: Montag 29. September 2014, 20:49

Dienstag 7. Oktober 2014, 11:52

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
Zuletzt geändert von Anonymous am Dienstag 7. Oktober 2014, 12:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

Dienstag 7. Oktober 2014, 12:52

@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.
joergimann
User
Beiträge: 14
Registriert: Montag 29. September 2014, 20:49

Dienstag 7. Oktober 2014, 13:13

Kann ich denn alle Objekte vom Chart aufheben
z.B.
for child in self:
.......

und dann neu zeichnen?

Wie zeichne is es denn neu?
BlackJack

Dienstag 7. Oktober 2014, 13:26

@joergimann: Ich verstehe die Frage nicht so ganz. Du hast doch eine `JS_OnPaint()`-Methode die den Chart neu zeichnet!?
joergimann
User
Beiträge: 14
Registriert: Montag 29. September 2014, 20:49

Dienstag 7. Oktober 2014, 13:44

Ja habe ich.
ABer die OnPaint funktion braucht ca. 2 Minuten :-(
BlackJack

Dienstag 7. Oktober 2014, 15:03

@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.
Antworten