Я пытаюсь создать приложение, в котором пользователь может перетаскивать некоторые кнопки вокруг панели.Сначала у меня произошла ошибка о событии захвата мыши, и я наконец обнаружил, что мне нужно перехватить это событие, чтобы предотвратить ошибку.
Но теперь, когда я запускаю приложение, я могу перетащить и отпустить кнопку, как бы приложениепосле отпускания левой кнопки мыши полностью зависает.
Я должен остановить его, нажав Ctrl + C на терминале, в противном случае моя мышь не работает в других окнах моего рабочего стола.
IПодозреваю, что проблема захвата мыши не очень хорошо обрабатывается.
Я работаю в Ubuntu 16.04 с Python 3.5, установленным из пакета (apt).Я пробовал как с wxPython 4.0.0, установленным из пакета (apt), так и с последней версией wxPython 4.0.4, установленной из pip.
В обоих случаях приложение полностью зависает после нажатия или перетаскивания кнопки.
import wx
class DragButton(wx.Button):
def __init__(self, parent, id=wx.ID_ANY, label="", pos=(0, 0)):
super().__init__(parent=parent, id=id, label=label, pos=pos)
self._dragging = False
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, lambda evt: None)
def OnLeftDown(self, evt):
print("Left down")
if not self.HasCapture():
self.CaptureMouse()
x, y = self.ClientToScreen(evt.GetPosition())
originx, originy = self.GetPosition()
dx = x - originx
dy = y - originy
self.delta = ((dx, dy))
def OnLeftUp(self, evt):
print("Left UPPPP")
if self.HasCapture():
self.ReleaseMouse()
def OnMouseMove(self, evt):
if evt.Dragging() and evt.LeftIsDown():
x, y = self.ClientToScreen(evt.GetPosition())
fp = (x - self.delta[0], y - self.delta[1])
self.Move(fp)
class GDomFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title, size=(350, 300))
self._init_ui()
self.Centre()
def _init_ui(self):
panel = wx.Panel(self)
self.button = DragButton(panel, label="Drag me", pos=(10, 10))
if __name__ == '__main__':
print("wxPython version: {}".format(wx.__version__))
app = wx.App()
ex = GDomFrame(None, title='GDom Application')
ex.Show()
app.MainLoop()
С этим кодом у меня будет кнопка, с помощью которой я могу несколько раз перемещаться по панели.