1

以下のコードは、ドラッグ アンド ドロップするリスト ボックスを含むフレームを作成します。以下の行のコードを理解したい..

FileAndTextDropTarget はクラスです。このクラスは、OnFileDrop と OnTextDrop の 2 つの関数で呼び出されます。私の質問は、パラメーター ファイルまたはテキストが渡されずに OnFileDrop または OnTextDrop が呼び出される方法です。

self.dt = FileAndTextDropTarget(self.OnFileDrop, self.OnTextDrop)

コード:

class DropTargetFrame(wx.Frame):
    pdb.set_trace()
    def __init__(self, parent, id=wx.ID_ANY, title="", 
                 pos=wx.DefaultPosition, size=wx.DefaultSize,
                 style=wx.DEFAULT_FRAME_STYLE,
                 name="DropTargetFrame"):
        super(DropTargetFrame, self).__init__(parent, id,
                                              title, pos,
                                              size, style,
                                              name)

        # Attributes
        choices = ["Drag and Drop Text or Files here",]
        self.list = wx.ListBox(self, 
                               choices=choices)
        self.dt = FileAndTextDropTarget(self.OnFileDrop,
                                        self.OnTextDrop)

        self.list.SetDropTarget(self.dt)

        # Setup
        self.CreateStatusBar()

    def OnFileDrop(self, files):
        self.PushStatusText("Files Dropped")
        for f in files:
            self.list.Append(f)

    def OnTextDrop(self, text):
        self.PushStatusText("Text Dropped")
        self.list.Append(text)


class FileAndTextDropTarget(wx.PyDropTarget):
    """Drop target capable of accepting dropped files and text"""
    def __init__(self, file_callback, text_callback):
        assert callable(file_callback)
        assert callable(text_callback)
        super(FileAndTextDropTarget, self).__init__()

        # Attributes
        self.fcallback = file_callback # Drop File Callback
        self.tcallback = text_callback # Drop Text Callback
        self._data = None
        self.txtdo = None
        self.filedo = None

        # Setup
        self.InitObjects()

    def InitObjects(self):
        """Initializes the text and file data objects"""
        self._data = wx.DataObjectComposite()
        self.txtdo = wx.TextDataObject()
        self.filedo = wx.FileDataObject()
        self._data.Add(self.txtdo, False)
        self._data.Add(self.filedo, True)
        self.SetDataObject(self._data)

    def OnData(self, x_cord, y_cord, drag_result):
        """Called by the framework when data is dropped on the target"""
        if self.GetData():
            data_format = self._data.GetReceivedFormat()
            if data_format.GetType() == wx.DF_FILENAME:
                self.fcallback(self.filedo.GetFilenames())
            else:
                self.tcallback(self.txtdo.GetText())

        return drag_result
4

1 に答える 1

0

私が理解しているように、「SetDropTarget」を呼び出すと、wxPython に GUI のその部分でのマウス イベントを監視するように指示します。TextDataObject などには、サポートされている形式と、そこに到達したときにレンダリングする方法を知るための「スマート」が含まれています (wxPython デモによる)。

そのため、何かを選択してドラッグを開始すると、wxPython が判断できます。以下も参照してください。

于 2012-05-21T17:33:49.180 に答える