我正在尝试使用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()
答案 0 :(得分:1)
尝试替换
行 ds = wx.DropSource(self)
与
ds = wx.DropSource(self.GetParent())
我能够重现你所看到的崩溃,但是一旦我做了上述改变,崩溃就消失了。
似乎由于某种原因,wx不喜欢将wx.StaticText
(或者你的子类)的实例传递给wx.DropSource
构造函数。我不知道为什么。
我更改了您的代码,以便Txt
从wx.TextCtrl
而不是wx.StaticText
派生,我无法再重现此问题。我还尝试使用http://wiki.wxpython.org/DragAndDrop上的第一个示例程序,并发现如果我将drop source设置为此代码创建的StaticText
对象之一而不是{ {1}}。
如果wxWidgets或wxPython文档中有任何内容表明您无法使用TextCtrl
作为放置源,我找不到它。这对我来说当然不是很明显。 (documentation for wxDropSource表示您传递给每个构造函数
启动拖放操作的窗口。
但是,对于可以用作放置源的“窗口”(或“窗口小部件”)的类型似乎没有任何限制。)