簡體   English   中英

wxPython:處理父對象中的拖放-事件傳播問題

[英]wxPython: Handling drag-and-drop in a parent object - problem with event propagation

我有一個wxPython程序,希望在其中拖動控件組以對其重新排序。 每組控件都在一個面板上,我希望該面板對象可以處理拖放操作。

當前,如果您單擊並拖動面板本身,則可以使用,但是,如果您單擊面板內部的任何控件,則無法使用。 這是因為我用來觸發拖動的wx.EVT_LEFT_DOWN事件不是命令事件,因此不會傳播到父面板。

我能想到的唯一解決方法是將事件綁定到面板上每個控件的面​​板處理程序。

這對我來說似乎不是很優雅-在創建每個子事件時我必須顯式地執行此操作,這會破壞封裝,或者面板通過子控件遞歸並進行綁定-這似乎很危險,因為各個控件可能已經將該事件用於其他目的。 理想情況下,我希望面板上的控件不需要了解有關DnD的任何信息。

有人知道其他替代解決方案嗎? 是否可以使用任何命令事件來啟動拖動? 還是其他我沒想到的?

我意識到這已經很晚了,但萬一它對某人還是有幫助的:

我已經在(相關)問題的代碼中完成了此操作:

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()

IMO最好的方法是,面板應綁定到控件的wx.EVT_LEFT_DOWN並僅在按下特殊的組合鍵(例如cntrl-alt-d)時拖動

Panel可以遞歸執行此操作,也可以在Panel中使用函數addControl,只有這樣的控件才會被掛接。

您所說的“單個控件可能已經將該事件用於其他目的”的觀點是無效的,因為您既可以使用該事件進行拖動,也不能同時使用。

如果希望將控件上的拖動用作整個組的拖動,則必須覆蓋此類事件,但是通過僅拖動特殊鍵組合或模式,您也可以讓子控件具有其行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM