2

スレッドとエディター コントロールの使用に問題があり、エディターでスレッド プロセスを使用できません。たとえば、スレッドを使用してエディター コントロールにテキストを追加するだけですが、バグが発生します。

PyAssertionError: C++ assertion "m_buffer && m_buffer->IsOk()" failed at ..\..\include\wx/dcbuffer.h(104) in wxBufferedDC::UnMask(): invalid backing store

これが私のコードです:

import threading
import  wx
import  wx.lib.editor    as  editor

class RunTest(threading.Thread):
    def __init__(self,master,type):
        threading.Thread.__init__(self)
        self.master = master
        self.type = type

    def run(self):
        if self.type == 1:
            for i in range(1000):
                self.master.ed.BreakLine(None)
                self.master.ed.SingleLineInsert("Text Line Number: " + str(i))

class Test(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Test', size=(900, 700))
        win = wx.Panel(self, -1)
        self.ed = editor.Editor(win, -1)
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.ed, 1, wx.ALL|wx.GROW, 1)
        win.SetSizer(box)
        win.SetAutoLayout(True)
        self.ed.Bind(wx.EVT_LEFT_DCLICK, self.OnClick)

    def OnClick(self,event):
        thread = RunTest(self,1)
        thread.start()


if __name__ == '__main__':
    app = wx.PySimpleApp()
    root = Test()
    root.Show()
    app.MainLoop()

修正を手伝ってください。ウィンドウ7で実行するwx.pythonライブラリ、python 2.7を使用します

4

1 に答える 1

1

非 GUI スレッドで GUI ウィジェットを更新しようとすると、通常、この種のエラーが発生します。

これらの目的のために小さなライブラリを作成しました: https://github.com/vaal12/workerthread

具体的には、examples\example_gui_class.py の例である @workerthread.executeInGUIThreadDecorator を参照してください。

于 2012-12-15T23:22:55.227 に答える