2009-12-09 8 views
0

에 문제 나는 내가 그들을 순서를 주변 컨트롤 그룹을 드래그 할 수 있도록하고자하는 wxPython에 프로그램을 가지고있다. 컨트롤의 각 그룹은 패널에 있으며, 패널 객체가 드래그 앤 드롭을 처리하기를 원합니다. 을 클릭하고 패널 자체에 드래그하면는 wxPython을 : 부모 객체에서 처리 드래그 앤 드롭 - 이벤트 전파

현재는 작동하지만 패널 내부에 컨트롤을 클릭하면 작동하지 않습니다. 드래그를 트리거하는 데 사용하는 wx.EVT_LEFT_DOWN 이벤트가 명령 이벤트가 아니므로 상위 패널까지 전파되지 않습니다. 나는이 라운드 얻는 생각할 수

수있는 유일한 방법은 패널의 모든 컨트롤 패널의 핸들러에 해당 이벤트를 결합하는 것입니다.

이것은 나에게 너무 우아하지 않습니다. 캡슐화를 끊는 각 자식 이벤트를 만들 때 또는 패널이 자식 컨트롤을 통해 반복되고 바인딩을 수행 할 때 명시 적으로 수행해야합니다. 이는 위험한 것 같습니다. 개별 컨트롤은 이미 다른 목적으로 해당 이벤트를 사용하고있을 수 있습니다. 이상적으로는 패널의 컨트롤이 DnD에 대해 알 필요가 없도록하고 싶습니다.

대체 솔루션을 아는 사람이 있습니까? 드래그를 시작하는 데 사용할 수있는 명령 이벤트가 있습니까? 아니면 내가 생각하지 못했던 다른 것?

답변

1

IMO 가장 좋은 방법은 패널 컨트롤의 wx.EVT_LEFT_DOWN에 결합하여, 예를 들어 경우에만 특수 키 조합을 드래그해야한다 CNTRL-ALT-D는

패널 재귀 적으로 수행하거나 부착해야하는 패널하여 AddControl 함수 및 그러한 제어를 누를 수있다.

요점 "개별 컨트롤이 이미 다른 목적을 위해 해당 이벤트를 사용할 수 있습니다"중 하나를 드래그를 위해 해당 이벤트를 사용하거나, 둘 다 방법이 없습니다 때문이 유효하지 않음.

컨트롤 전체를 드래그하여 전체 그룹의 드래그로 사용하려면 해당 이벤트를 재정의해야하지만 특수한 키 조합 만 드래그하면 하위 컨트롤에 동작이 적용될 수 있습니다.

2

나는이 말 오히려 실감하지만, 경우에 누군가에게 여전히 도움이 : 나는 my (related) question의 코드에서 이런 짓을 한

:

import wx 

app = wx.App(False) 
d = {} 

def wMouseDown(e): 
    print "!!!", e.GetEventObject() 

def MouseDown(e): 
    o   = e.GetEventObject() 
    sx,sy  = panel.ScreenToClient(o.GetPositionTuple()) 
    dx,dy  = panel.ScreenToClient(wx.GetMousePosition()) 
    o._x,o._y = (sx-dx, sy-dy) 
    d['d'] = o 

def MouseMove(e): 
    try: 
     if 'd' in d: 
      o = d['d'] 
      x, y = wx.GetMousePosition() 
      o.SetPosition(wx.Point(x+o._x,y+o._y)) 
    except: pass 

def MouseUp(e): 
    try: 
     if 'd' in d: del d['d'] 
    except: pass 

frame = wx.Frame(None, -1, 'simple.py') 
panel = wx.Panel(frame) 
box = wx.BoxSizer(wx.VERTICAL) 
button1 = wx.Button(panel, -1, "foo") 
box.Add(button1, 0, wx.ALL, 10) 
button2 = wx.Button(panel, -1, "bar") 
box.Add(button2, 0, wx.ALL, 10) 

button1.Bind(wx.EVT_LEFT_DOWN, MouseDown) 
button2.Bind(wx.EVT_LEFT_DOWN, MouseDown) 

button1.Bind(wx.EVT_MOTION, MouseMove) 
button2.Bind(wx.EVT_MOTION, MouseMove) 

button1.Bind(wx.EVT_LEFT_UP, MouseUp) 
button2.Bind(wx.EVT_LEFT_UP, MouseUp) 

panel.Bind(wx.EVT_MOTION, MouseMove) 
panel.Bind(wx.EVT_LEFT_UP, MouseUp) 

panel.SetSizer(box) 
panel.Layout() 
frame.Show() 

app.MainLoop()