使用多处理/线程来使用Tkinter读取串行端口和实时图形数据

时间:2017-06-15 18:11:15

标签: python tkinter python-multithreading python-multiprocessing pyserial

我需要高速生活图表数据。我需要不断查询串口,以便在可用时检索数据。然后数据修改我正在绘制的实例变量。我在两个子图上绘制了4条不同的线,总共8条线。我收到了12个不同的变量,但只有图表8.我需要在运行函数一次后不会消失,这样我可以继续接收新数据。我希望绘图在另一个进程中完成,这样它就不会阻塞读取串口。我已经找到了示例并且已经获得了如何实现这一点的帮助,如果我已经拥有所有数据但是如果它不断接收新数据并且我不熟悉多处理/线程,那么很难理解如何修改它以便不断读取从串口。我可以以10Hz的速率完成我需要的工作,但我需要以20Hz的频率进行采样,似乎唯一的方法是通过多处理/线程,除非我遗漏了一些可以优化图形或读取时间的东西。这是一个Tkinter窗口,当按下go按钮时会查询串口并显示图形:

public ActionResult GetInfo(string term)
{
    using (var dbContext = new DatabaseContext())
    {
        // use DbContext to get data from the database
        var retrievedData = dbContext.TableName.Where(...);
        return Json(retrievedData.Select(data => new {
            id = data.id,
            text = data.text
         }));
    }
}

如果有人可以帮助我理解多处理或提供一个很好的例子。谢谢

1 个答案:

答案 0 :(得分:2)

如果你提供计时器,你可以拥有一个能够为你管理事件的功能。

例如:

import time
import tkinter as tk

root = tk.Tk()

def getData():
    print("getData")

def update_graph():
    print("update_graph")

def timed_events():
    getData()
    update_graph()
    root.after(1000, timed_events) # you can change the number to anything you need

timed_events()

root.mainloop()

这将按顺序调用每个函数1秒并打印:

getData
update_graph

这只是一个简单的例子,用于说明如何在计时器上处理数据处理。

更新

这是您的代码的另一个可选选项。 在start(self):方法中,在末尾添加if语句以重复方法if self.x == True:。然后你需要做的就是创建一个切换变量self.x的按钮,这样你就可以在需要的时候停止循环。

self.x == True

    def start(self):
        # all your code so far
        if self.x == True:
            self.start