&引用;“穿线”;在Python中,绘制接收到的数据并同时发送

&引用;“穿线”;在Python中,绘制接收到的数据并同时发送,python,multithreading,wxpython,blocking,pyserial,Python,Multithreading,Wxpython,Blocking,Pyserial,我在这里征求一些高层意见。我正在使用Python绘制通过串行通信不断接收的数据。同时,我希望用户能够通过提示符(例如Python shell)输入数据。然后,该数据将通过同一串行端口发送,以与同时发送数据的设备通信 我的问题是plotting app.MainLoop()“Thread”似乎被阻塞,在关闭窗口之前,它不会显示我的原始输入部分。我也尝试过将这4行放在我的while循环中,但同样的问题也出现了——它允许我一次输入所有信息,但一旦绘图开始,它将永远阻塞,直到我关闭绘图窗口 if __n

我在这里征求一些高层意见。我正在使用Python绘制通过串行通信不断接收的数据。同时,我希望用户能够通过提示符(例如Python shell)输入数据。然后,该数据将通过同一串行端口发送,以与同时发送数据的设备通信

我的问题是plotting app.MainLoop()“Thread”似乎被阻塞,在关闭窗口之前,它不会显示我的原始输入部分。我也尝试过将这4行放在我的while循环中,但同样的问题也出现了——它允许我一次输入所有信息,但一旦绘图开始,它将永远阻塞,直到我关闭绘图窗口

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代码时遇到的问题,但我不确定为什么……有什么想法吗?

免责声明:我不认为以下是好的做法

您可以将wx内容的执行放在单独的线程中

app = wx.App()
window = DataLoggerWindow()
import threading
class WindowThread(threading.Thread):
    def run(self):
        window.Show()
        app.MainLoop()
WindowThread().start()
这样,
MainLoop
只阻塞另一个线程,主线程应该仍然可用


但是,我认为这不是最佳的方法,您应该使用类似App.OnIdle钩子的东西。

我不是
wxpython
方面的专家,但是
MainLoop
接管程序执行的全部目的不是吗?如果您希望能够在单独的线程中同时运行其他内容,则可能需要自己创建线程。请尝试不使用控制台输入,而是使用wx文本字段或类似的内容。添加代码以在文本字段代码中处理其输入。