1

wx.ProgressDialog をスレッド化しようとしています。プログレススレッドクラスを取得しました

class Progress(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        max = 1000000

        dlg = wx.ProgressDialog("Progress dialog example",
                               "An informative message",
                               maximum = max,
                               parent=None,
                               style = wx.PD_CAN_ABORT
                                | wx.PD_APP_MODAL
                                | wx.PD_ELAPSED_TIME
                                | wx.PD_ESTIMATED_TIME
                                | wx.PD_REMAINING_TIME
                                )
        keepGoing = True
        count = 0

        while keepGoing and count < max:
            count += 1
            wx.MilliSleep(250)

            if count >= max / 2:
                (keepGoing, skip) = dlg.Update(count, "Half-time!")
            else:
                (keepGoing, skip) = dlg.Update(count)
        dlg.Destroy()

ボタンを押すと呼び出されます

class MiPPanel ( wx.Panel ):
    [...]
    def runmiP(self, event):
        thread1 = Progress() 
        thread1.start() 

thread1.start() を実行すると、何百もの警告が2012-12-01 00:31:19.215 Python[3235:8807] *** __NSAutoreleaseNoPool(): Object 0x11a88f300 of class NSConcreteAttributedString autoreleased with no pool in place - just leaking 表示され、プログレス バーが表示されません。

wxPython でスレッドを使用して進行状況バーを作成するにはどうすればよいですか?

4

2 に答える 2

1

すべての wxPython ウィジェットと操作は、単一のスレッドで行う必要があります。ダイアログを別のスレッドで制御したい場合は、タイマーとキューを使用して、別のスレッドからダイアログにメッセージを送る必要があります。

私が理解している別の方法は、ダイアログ用に別のスレッドで完全に別の wxApp を作成するために機能するはずです (私はこれをテストしていません)。なんらかの方法でメイン スレッドに戻る必要があります。

編集: 詳細情報へのリンクは次のとおりです。下部に、wx.CallAfter を使用してワーカー スレッドの進行状況を更新する方法に関する情報があります。また、別のクラスを作成せずに、別のスレッドで単一の関数を実行する方法も示します。

wxPython スレッド化

于 2012-12-04T03:41:47.920 に答える
0

引数 4 が wxWindow ではないことに文句を言っているようです (したがって、argument 4 of type 'wxWindow *'エラーの一部です)。

呼び出しを見ると、引数 4 が渡されていparent=selfます。それで、何selfですか?言い換えれば、このコードを含むメソッドはどのクラスの一部ですか? それはまたは のwx.Windowサブクラスであるか、またはではないApplicationまたは のようなものProgressですか?

(実際には、キーワード引数として渡していることを考えると、コンストラクターへの呼び出しで 4 番目の位置にあり、基になる C++ 関数の呼び出しでも 4 番目の位置にあるparentのは単なる偶然です。wx.ProgressDialogと を切り替えるmaximumと同じエラーが発生しますが、の代わりにparentまだ表示されると思います。)argument 4argument 3

これを確認するには、失敗した呼び出しで を取り出してみてください。動作するはずです。または、それだけで動作する呼び出しにparent=self追加すると、失敗するはずです。parent=object()None

もちろん、それで実際に問題が解決するわけではありません。しかし、それを行うには、 をどうしたいかを理解しparent、 の代わりにそれを渡す必要がありselfます。

PS、問題はスレッドとはまったく関係がないと思います。

于 2012-11-30T23:19:06.987 に答える