2 Maus-Events gleichzeitig registrieren

Plattformunabhängige GUIs mit wxWidgets.
Antworten
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hallo,

eine Frage bzgl. den EVENTs: EVT_MOTION und EVT_LEFT_DOWN:
Ich möchte gern erreichen, dass im Statusbar die Koordinaten der Maus immer dann aktualisiert werden, wenn ich die linke Maustaste drücke und gleichzeitig die Maus bewege. Vielleicht kann mir einer einen Tipp geben?

Code: Alles auswählen

import wx
import wx.lib.plot as plot

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, id=-1, size=(410, 340))
        self.statusbar = self.CreateStatusBar()

        self.client = plot.PlotCanvas(self)
        self.client.SetInitialSize(size=(400, 300))
        self.client.SetEnableGrid(True)


class MyApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, True)

    def OnInit(self):
        self.frame = MyFrame()
        self.frame.Show(True)

        data = [(1,2), (2,3), (3,5), (4,6), (5,8), (6,8), (12,10), (13,4)]
        line = plot.PolyLine(data, colour='red', width=1)
        marker = plot.PolyMarker(data, marker='triangle')
        gc = plot.PlotGraphics([line, marker], 'Graph', 'x', 'y')
        self.frame.client.Draw(gc, xAxis=(0,15), yAxis=(0,15))

        self.frame.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMovePoint)
        # self.frame.client.canvas.Bind(wx.EVT_MOTION, self.OnMovePoint)
        return True

    def OnMovePoint(self, evt):
        s = "%.2f, %.2f" % self.frame.client._getXY(evt)
        self.frame.statusbar.SetStatusText(s)
        evt.Skip()


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

Vielen Dank, calo
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Hallo,

ich würde es folgendermassen versuchen:
  • * Definieren eine Variable in deiner Klasse mit dem Anfangswert False
    * Sobald die linke Maustaste gedrückt wird, setze die Variable auf True
    * Sobald die linke Maustaste losgelassen wird, setze die Variable auf False
    * Die Koordinaten in der Statuszeile werden nur dann aktualisiert, wenn besagte Variable den Wert True hat
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Hi,

:D Super. Vielen Dank ... es funktioniert.

Code: Alles auswählen

import wx
import wx.lib.plot as plot

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, id=-1, size=(410, 340))
        self.statusbar = self.CreateStatusBar()

        self.client = plot.PlotCanvas(self)
        self.client.SetInitialSize(size=(400, 300))
        self.client.SetEnableGrid(True)


class MyApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, True)

    def OnInit(self):
        self.frame = MyFrame()
        self.frame.Show(True)

        data = [(1,2), (2,3), (3,5), (4,6), (5,8), (6,8), (12,10), (13,4)]
        line = plot.PolyLine(data, colour='red', width=1)
        marker = plot.PolyMarker(data, marker='triangle')
        gc = plot.PlotGraphics([line, marker], 'Graph', 'x', 'y')
        self.frame.client.Draw(gc, xAxis=(0,15), yAxis=(0,15))
        self._LeftDown = False

        self.frame.client.canvas.Bind(wx.EVT_MOTION, self.OnMovePoint)
        self.frame.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
        self.frame.client.canvas.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
        return True

    def OnMovePoint(self, evt):
        if self._LeftDown:
            s = "%.2f, %.2f" % self.frame.client._getXY(evt)
            self.frame.statusbar.SetStatusText(s)
        evt.Skip()

    def OnMouseLeftDown(self, evt):
        self._LeftDown = True

    def OnMouseLeftUp(self, evt):
        self._LeftDown = False


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()
Antworten