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.StaticText何らかの理由で、wx はインスタンス(またはあなたの場合はそのサブクラス) がコンストラクターに渡されるのを好まないようwx.DropSourceです。理由はわかりません。

代わりにTxtから派生するようにコードを変更したため、問題を再現できなくなりました。また、 http://wiki.wxpython.org/DragAndDropにある最初のサンプル プログラムを試してみたところ、ドロップ ソースを、このコードが作成するオブジェクトの 1 つに設定すると、クラッシュする可能性があることがわかりました。 .wx.TextCtrlwx.StaticTextStaticTextTextCtrl

wx.StaticTextwxWidgets または wxPython のドキュメントに、a をドロップ ソースとして使用できないという記述がある場合、私はそれを見つけられませんでした。それは確かに私には明らかではありませんでした。( wxDropSource のドキュメントには、各コンストラクターに渡すと書かれています

ドラッグ アンド ドロップ操作を開始するウィンドウ。

ただし、ドロップ ソースとして使用できる「ウィンドウ」(または「ウィジェット」) の種類に制限はないようです。)

于 2013-05-25T10:58:20.890 に答える