2017-06-23 8 views
0

私はwx.FrameとThreadingを同時に処理するクラスを作成しようとしています(私はVisual(threadins.Thread、wx.Frame)もユーザにしようとしましたが、私は実際にはwx.CallAfterを使いたくないので、あるクラスでのみ処理したいのですが、コードを実行するとすべて正常に動作しますが、Closeメソッドはプログラムをクラッシュさせ、フレームは開いたままです。どこが間違っている?wx.Frameと同じクラスのスレッディング

import threading 
import wx 

class Visual(threading.Thread): 
    def __init__(self, title): 
      screenWidth = 500 
      screenHeight = 400 
      screenSize = (screenWidth,screenHeight) 
      self.app = wx.App(False) 
      self.frame = wx.Frame(None, wx.ID_ANY,title, size=screenSize) 
      panel = wx.Panel(self.frame) 
      self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
        style=wx.LC_REPORT 
        |wx.BORDER_SUNKEN 
        ) 
      self.list_ctrl.InsertColumn(0, 'Name', width=125) 
      self.list_ctrl.InsertColumn(1, 'DDD') 
      self.list_ctrl.InsertColumn(2, 'Phone') 
      self.list_ctrl.InsertColumn(3, 'Desc', width=125) 
      sizer = wx.BoxSizer(wx.VERTICAL) 
      sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
      panel.SetSizer(sizer) 

      self.ready = False 

      threading.Thread.__init__(self) 
      self.frame.Bind(wx.EVT_CLOSE, self.close) 
      self.start() 
    def close(self, event): 
     print("Close") 
     self.frame.Destroy() 
     self.app.Destroy() 
     self.app.ExitMainLoop() 

    def run(self): 
      self.frame.Show(True) 
      self.ready = True 
      self.app.MainLoop() 
if __name__ == '__main__': 
    visu = Visual(title='Test') 

感謝。

+2

を私はあなたが呼び出したらWXに()を破壊することを示唆していると思った:詳細については、以下のリンクを参照してください。オブジェクトを使用するべきではありません。すべてのwxオブジェクトは、C++プロキシオブジェクトによってバックアップされています。これは、おそらく破棄されているか、Destroyを呼び出した後で使用できない状態になっています。 closeメソッドのコードは、破棄した後にself.appを使用します。あなたは時々それを離れてしまうかもしれませんが、それは良い考えではありません。 –

答えて

3

wxPythonのは非常に他のすべてのデスクトップのGUIツールキット(ETCすなわちPyQtは、Tkinterの、)のように、メインスレッドにあることがその主なループを必要とします。あなただけ起動する必要がありますt wxPythonのメインループが開始された後にうまくいきます。言い換えれば、スレッドはwxPython内から開始する必要があります。

wxPythonにはスレッドセーフな方法が3つあります。それらは次の通りです:

  • wx.CallAfter
  • wx.PostEvent
  • wx.CallLater

とにかく、これはほぼ確実にあなたがスレッドクラスと1つまたは複数のwxPythonを持っている必要があります関連するクラス。これは通常の方法であり、推奨される方法です。私はMikeDriscollからの回答に同意

+1

bah私はほとんどそれ(wx; P)のためのいくつかの並べ替えの警告を持っている必要があります...それはwx.CallAfter(もちろん、すべてのそれらのリンクを行うことができます)を言及する価値があるかもしれません脇に@ブラウンマイクブログ2番目のリンクを参照してください)は、すべてのものwxのための驚くべきリソースです! –

+1

私はちょうど幸運を得ました...しかし、私はあなたの答えも素晴らしいだろうと確信しています! –

関連する問題