2

ここでいくつかのハイレベルなアドバイスを求めています。私はPythonを使用して、シリアルを介して常に受信されるデータをプロットしています。同時に、ユーザーがプロンプト(Pythonシェルなど)を介してデータを入力できるようにする必要があります。次に、そのデータは同じシリアルポートを介して送信され、データを送信しているデバイスと通信します。

私の問題は、プロットapp.MainLoop() "Thread"がブロックされているように見え、ウィンドウが閉じられるまでraw_input部分が表示されないことです。また、これらの4行をwhileループ内に配置しようとしましたが、同じ問題が発生します。すべての情報を1回入力できますが、プロットを開始すると、グラフウィンドウを閉じるまで永久にブロックされます。

if __name__ == '__main__':
    app = wx.App()
    window = DataLoggerWindow()
    window.Show()
    app.MainLoop()
    prompt_counter = "main"
    while(1):
        if prompt_counter == "main":
            ans = raw_input("Press f for freq, press a for amplitude: \n")
            if ans == "f":
                prompt_counter = "freq"
            elif ans == "a":
                prompt_counter = "amp"
            else:
                prompt_counter = "main"
        elif prompt_counter == "freq":
                freq = raw_input("Enter the frequency you want to sample at in Hz: \n")
                ser.write("f"+freq+"\n")
                prompt_counter = "main"
        elif prompt_counter == "amp":
                amp = raw_input("Type in selection")    
                ser.write("a"+amp+"\n")
                prompt_counter = "main"

プロット部分は、シリアルポートを読み取り、受信したデータを印刷するだけです。両方の部分は、バックエンドのデバイスで別々に機能します。ですから、これは私がPythonコードをどのように書いたかに問題があると確信していますが、理由はわかりません。

4

1 に答える 1

1

免責事項:次のことは良い習慣ではないと思います。

wxのものの実行を別のスレッド内に置くことができます。

app = wx.App()
window = DataLoggerWindow()
import threading
class WindowThread(threading.Thread):
    def run(self):
        window.Show()
        app.MainLoop()
WindowThread().start()

そうMainLoopすれば、は別のスレッドをブロックしているだけであり、メインスレッドは引き続き使用可能です。

ただし、これは最適なアプローチではなく、App.OnIdleフックのようなものを使用する必要があると思います。

于 2012-11-22T09:12:42.363 に答える