2012-02-27 3 views
0

부모가 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() 
+0

마우스 캡처 및 드래그 델타 이동을 사용하도록 이벤트 처리 기능이 업데이트되었습니다. MouseDown의 위치). 그러나 여전히 제대로 작동하지 않습니다. 그것은 마우스 포인터보다 훨씬 느리게 움직이는 것 같습니다 ... –

답변

0

당신이를 만들어야합니다 나는 wxPython에이 코드를 훨씬 쉽게이 중 일부를 만들 것 같은 센터에서보다는 모서리 오브젝트를 배치 할 수있는 방법을 제공합니다 생각하지 않습니다 당신이하고있는 것을 보여주는 작은 실행 가능한 예제 : http://wiki.wxpython.org/MakingSampleApps

그 동안 자신이 그린 오브젝트를 그냥 돌아 다니면 DragImage 데모가 유용 할 것입니다. wxPython 데모에서 찾을 수 있습니다. 그렇지 않다면, 경험 많은 wxPython 개발자가 있으므로 공식 wxPython 메일 링리스트/Google 그룹에 묻는 것이 좋습니다. https://groups.google.com/forum/?pli=1#!forum/wxpython-users

+0

OP –

+0

의 편집 하단을 보시면 Google 그룹에 대한 링크를 제공하지 못했습니다 :( –

+0

죄송합니다. 메인 링크에 "메일 링리스트"라고 표시된 링크가 있다고 가정했습니다. wxPython 메일 링리스트는 분명히 분명했습니다. OP가 Google 사용법을 알고 있다는 인상하에있었습니다. http://bit.ly/ArRQC5도 참조하십시오. –

관련 문제