부모가 ScrolledWindow이고 가로 채기 마우스를 드래그하여 자식의 위치를 절대적으로 부모의 클라이언트 영역 내에서 재배치 할 수 있도록하는 중입니다. 나는 클라이언트의 가상 스크롤 영역이 아이들의 위치를 수용하기 위해 필요에 따라 확장되기를 원한다. (그래서 창보다 큰 그래프가 스크롤된다.) 드래그하는 것은 문제가있는 것처럼 보입니다. 개체를 왼쪽이나 위로 끌려고 할 때마다 모서리를 이동하려고하기 때문에 문제가있는 것입니다. 위젯이 현재 창 경계를 넘을 때도 스크롤하지 않습니다. 이 코드를 사용하는 드라이버에서 모든 ConceptNode 위젯은 SemNetWidget을 부모로 지정합니다. 나는 아이들의 절대 위치 (끌린 위치)가 유지되어야하기 때문에 sizer를 사용하지 않고있다.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()
마우스 캡처 및 드래그 델타 이동을 사용하도록 이벤트 처리 기능이 업데이트되었습니다. MouseDown의 위치). 그러나 여전히 제대로 작동하지 않습니다. 그것은 마우스 포인터보다 훨씬 느리게 움직이는 것 같습니다 ... –