Skip to main content
 首页 » 编程设计

python之Python中的"Threading",绘制接收到的数据并同时发送

2025年05月04日25JeffreyZhao

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

我的问题是绘图 app.MainLoop()“Thread”似乎阻塞了,在窗口关闭之前它不会显示我的 raw_input 部分。我也试过将这 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 Hook 的方法。