1

我正在尝试使用 wxPython 来学习拖放。为什么以下内容在 Linux 上不起作用?应用程序启动,但是当我将静态文本拖到文本字段中时,我使用 python 2.7 得到 2.8 版本的 139 退出代码。

import wx
class DropTarget(wx.DropTarget):
    def __init__(self):
            wx.DropTarget.__init__(self)
            self.dataobject = wx.PyTextDataObject()
            self.SetDataObject(self.dataobject)
    def OnData(self, x, y, d):
            pass

class Txt(wx.StaticText):
    def __init__(self, parent, label_):
            wx.StaticText.__init__(self, parent, label=label_)
            self.Bind(wx.EVT_LEFT_DOWN, self.handle)
    def handle(self, event):
            ds = wx.DropSource(self)
            d = wx.PyTextDataObject('some text')
            ds.SetData(d)
            ds.DoDragDrop(True)

class MyFrame(wx.Frame):
    def __init__(self):
            wx.Frame.__init__(self, None, -1, 'whatevs')
            main_panel = wx.Panel(self)

            txt = Txt(main_panel, 'ONE')
            txt2 = wx.TextCtrl(main_panel)

            s = wx.BoxSizer(wx.VERTICAL)
            s.Add(txt)
            s.Add(txt2)
            main_panel.SetSizer(s)

            dt = DropTarget()
            txt2.SetDropTarget(dt)


if __name__ == '__main__':
    app = wx.App()
    MyFrame().Show(True)
    app.MainLoop()
4

1 回答 1

1

换线试试

        ds = wx.DropSource(self)

        ds = wx.DropSource(self.GetParent())

我能够重现您所看到的崩溃,但是一旦我进行了上述更改,崩溃就消失了。

似乎出于某种原因, wx 不喜欢将实例wx.StaticText(或在您的情况下为它的子类)传递给wx.DropSource构造函数。我不确定为什么。

我更改了您的代码,以便从而不是Txt派生,并且我无法再重现该问题。我还尝试使用在http://wiki.wxpython.org/DragAndDrop上找到的第一个示例程序,发现如果我将放置源设置为该代码创建的对象之一,而不是.wx.TextCtrlwx.StaticTextStaticTextTextCtrl

如果 wxWidgets 或 wxPython 文档中有任何内容说您不能使用 awx.StaticText作为放置源,我没有找到它。这对我来说当然不是很明显。(wxDropSource 的文档说你传递给每个构造函数

启动拖放操作的窗口。

但是,您可以用作放置源的“窗口”(或“小部件”)的类型似乎没有任何限制。)

于 2013-05-25T10:58:20.890 回答