1

私はpythonとwxPythonを同時に学習しています...:)それで、コマンドラインから正常に実行される一連のpythonファイルがあります:./scan -d test ~/Pictures-たとえば、「test」と呼ばれる私の写真のデータベースを作成します。

私はこれのためにフロントエンドで熱心に取り組んできました(私は元のコマンドラインpythonファイルを書きませんでした)、そして私はそれを使用して実行させることができます:

def bt_ScanUpdateClick(self, event):
    self.SetSizeWH(450,360)

    ## DEBUG
    self.tc_MainDatabase.Value = "test.db"


    if self.tc_MainDatabase.Value == "":
        self.LogWindow.Value += "ERROR:\tNo database name selected!\n"
    else:
        scanCMD = "./scan -d " + self.tc_MainDatabase.Value + " "

        numLines=0
        maxLines=(int(self.multiText.GetNumberOfLines()))

        if self.multiText.GetLineText(numLines) == "":
            self.LogWindow.Value += "ERROR\tNo folder selected to scan!\n"
        else:
            self.LogWindow.Value += "Running Scan...\n\n"
            while (numLines < maxLines):
                scanCMD += str(self.multiText.GetLineText(numLines)) + " "
                numLines += 1

            self.LogWindow.Value += scanCMD

            p = subprocess.Popen([scanCMD],shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
            self.LogWindow.Value += p.communicate()[0]

これは私にとって問題を提示します:

  1. ボタンをクリックしてこれをアクティブにすると、実際には関数のself.SetSizeWH(450,360)部分に到達しません。それは単に「ダウン」状態のままです。コマンドが実行されると、アプリは出力ウィンドウ(self.LogView)にすべてが表示された状態で復活します...より「リアルタイム」な方法で出力を取得したいのですが...可能ですか?

何かご意見は?

4

1 に答える 1

1

大まかに言えば、画面の更新はイベントループの各反復中に発生します。コードの実行中、イベントループは同じ反復でスタックするため、画面の更新は発生しません。

これを回避するには、長時間実行されるタスクを別のスレッドまたはプロセスで実行する必要があります。wxPythonはシングルスレッドであるため、GUIの更新(出力行の書き込みなど)はメインスレッドで行う必要があります。これを行うために、ワーカースレッドはwx.CallAfter、GUIスレッドで実行されるコマンドをできるだけ早くスケジュールするために使用できます。

詳細については、wxPython wikiの「長時間実行タスク」ページを参照してください。また、「 wxPython:スレッドの問題」という質問に対するこの回答を参照してください。このウェブサイトで。

于 2011-07-10T03:00:56.683 に答える