Ich stieß auf ein Problem, bei dem das Ereignis wx.EVT_LEFT_UP falsch zu feuern scheint oder zumindest sehr kontraintuitiv ist.wxpython: Mouse Up-Ereignis wird falsch ausgelöst
Ich möchte eine Funktion aufrufen, wenn ich auf ein Panel herunterklicke, die Taste gedrückt halte und dann eine Funktion feuere, wenn ich auf ein anderes Panel klicke.
Betrachten Sie den folgenden Code ein:
import wx
class Example(wx.Frame):
def __init__(self, *args, **kwargs):
super(Example, self).__init__(*args, **kwargs)
panel = wx.Panel(self)
# left panel
lPan = wx.Panel(panel)
lPan.SetBackgroundColour('#9C4141')
lPan.Bind(wx.EVT_LEFT_DOWN, lambda e, p='left': self.onLeftDown(e, p))
lPan.Bind(wx.EVT_LEFT_UP, lambda e, p='left': self.onLeftUp(e, p))
# right panel
rPan = wx.Panel(panel)
rPan.SetBackgroundColour('#415C9C')
rPan.Bind(wx.EVT_LEFT_DOWN, lambda e, p='right': self.onLeftDown(e, p))
rPan.Bind(wx.EVT_LEFT_UP, lambda e, p='right': self.onLeftUp(e, p))
# box sizer
hbox = wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(lPan, 1, flag=wx.EXPAND)
hbox.Add(rPan, 1, flag=wx.EXPAND)
panel.SetSizer(hbox)
self.Show()
def onLeftDown(self, e, panel):
print('Mouse down on {} panel'.format(panel))
def onLeftUp(self, e, panel):
print('Mouse up on {} panel'.format(panel))
if __name__ == '__main__':
app = wx.App()
Example(None, title='Down and Up click', size=(200, 150))
app.MainLoop()
wären dies beispiels mit JavaScript ganz gut, da die Elementbindung an die Events auf Down- und Up-Klicks unabhängig reagieren würde. Hier scheint es jedoch, dass das Up-Ereignis nur für das Panel ausgelöst wird, auf das zuvor geklickt wurde. (siehe Bild).
Wie Sie sehen können, ist das Up-Ereignis für das linke Panel stattdessen für das rechte Fenster gefeuert. Hat jemand eine Erklärung dafür?
Hallo, unter Windows, sowohl auf 2.7/wxPython 2.9 und auf 3.6.2/wxPython 4.0 Ihr Beispiel, wie Sie arbeitet erwartet (unten links/oben rechts). Sie können den [WIT] (https://wiki.wxpython.org/Widget%20Inspection%20Tool) verwenden, den Zwei-Liner einfügen, bevor Sie den Haupt-Loop betreten, zu den Panels navigieren und den Event-Viewer aktivieren, um alle Events zu sehen für die zwei Panels in Echtzeit. – nepix32
Danke für den Hinweis mit dem Inspektor. Ich benutze es und für mich gibt es wirklich keine Mouse-Up-Ereignis (oder andere Ereignisse als Bewegung und Setcursor) auf der rechten Seite nach dem Ziehen. Ich benutze auch die Version wxPython 4 ('4.0.0b1 osx-cocoa (phoenix)', um genau zu sein), es scheint also ein Fehler bei der MacOS-Implementierung zu sein. – Azial