试图在wXPython中创建滚动窗口的可拖动子项
我试图创建其父对象是滚动窗口的子对象,并拦截鼠标拖动,以允许在父对象的客户端区域内完全重新定位子对象。我希望客户端虚拟滚动区域根据需要扩展,以适应子对象的位置,从而滚动一个大于窗口的图形。拖动似乎是有问题的,因为它想一直在拐角处移动试图向左或向上拖动对象是有问题的。当小部件超出当前窗口边界时,它也不会滚动。在使用此代码的驱动程序中,所有ConceptNode小部件都将SemNetWidget指定为其父节点。我没有使用尺寸测量仪,因为应该保持子对象的绝对位置。我不认为wxPython提供了一种通过中心而不是通过角来定位对象的方法,因为它会使其中一些更容易编码:试图在wXPython中创建滚动窗口的可拖动子项,python,scroll,wxpython,draggable,children,Python,Scroll,Wxpython,Draggable,Children,我试图创建其父对象是滚动窗口的子对象,并拦截鼠标拖动,以允许在父对象的客户端区域内完全重新定位子对象。我希望客户端虚拟滚动区域根据需要扩展,以适应子对象的位置,从而滚动一个大于窗口的图形。拖动似乎是有问题的,因为它想一直在拐角处移动试图向左或向上拖动对象是有问题的。当小部件超出当前窗口边界时,它也不会滚动。在使用此代码的驱动程序中,所有ConceptNode小部件都将SemNetWidget指定为其父节点。我没有使用尺寸测量仪,因为应该保持子对象的绝对位置。我不认为wxPython提供了一种通过
class SemNetWidget(wx.ScrolledWindow):
def __init__(self,edit,*args,**kwargs):
self.editor=edit
super(SemNetWidget,self).__init__(*args,**kwargs)
self.SetScrollbars(1,1,1,1)
class ConceptNode(wx.StaticText):
count=0
def __init__(self,nm,*args,**kwargs):
if not kwargs.has_key("style"):
kwargs["style"]=0
kwargs["style"]=wx.SIMPLE_BORDER|wx.ALIGN_CENTRE
super(ConceptNode,self).__init__(*args,**kwargs)
par=args[0]
self.nm=nm
self.mcap=False
self.par=par
self.SetLabel(" %s " % self.nm)
self.Move((0,15*self.count)) # so new nodes don't overlap
self.par.FitInside()
self.Bind(wx.EVT_MOUSE_EVENTS,self.onDrag)
self.Bind(wx.EVT_MOTION,self.onDrag)
self.Bind(wx.EVT_MOUSE_CAPTURE_LOST,self.onUncap)
ConceptNode.count+=1
def onUncap(self,evt):
self.mcap=False
self.drag=None
def onDrag(self,evt):
if evt.Dragging() and self.drag is not None:
#cdc=wx.ClientDC(self)
#self.PrepareDC(cdc)
#pos=list(evt.GetLogicalPosition(cdc))
pos=evt.GetPosition()
dx=pos[0]-self.drag['x']
dy=pos[1]-self.drag['y']
self.SetPosition((self.drag['ox']+dx,
self.drag['oy']+dy),
wx.SIZE_ALLOW_MINUS_ONE)
if evt.LeftDown():
pos=evt.GetPosition()
opos=self.GetPosition()
self.drag={'x':pos[0],'y':pos[1],
'ox':opos[0],'oy':opos[1]}
self.CaptureMouse()
self.mcap=True
evt.Skip()
if evt.LeftUp():
self.drag=None
if self.mcap:
self.ReleaseMouse()
司机:
if __name__=="__main__":
app=wx.App()
window=wx.Frame(None,wx.ID_ANY)
frame=SemNetWidget(None,window) # None:=No editor object
c1=ConceptNode("Concept1",frame)
c2=ConceptNode("Concept2",frame)
window.Show()
app.MainLoop()
您应该创建一个小的可运行示例,演示您正在做的事情:
同时,如果您只是在自己绘制的对象周围移动,那么您可能会发现DragImage演示非常有用。可以在wxPython演示中找到它。否则,我建议您在官方的wxPython邮件列表/googlegroup上询问,因为那里有很多经验丰富的wxPython开发人员:对不起。我认为主wxPython邮件列表上标记有链接的邮件列表非常明显。我的印象是OP知道如何使用谷歌。另请参见更新了事件处理以使用鼠标捕获和拖动增量移动记住鼠标向下的初始单击点和对象初始位置。然而,它仍然不能很好地工作。它的移动速度似乎比鼠标指针慢得多。。。