Python GUI中的实时绘图

时间:2013-04-01 01:12:21

标签: python user-interface matplotlib tkinter export-to-csv

我正在尝试编写Python GUI,我需要做一个实时情节。我目前有一个程序从我正在使用的机器接收数据,我希望能够在收到机器时输出机器输出的值。我一直在研究,到目前为止,我发现它似乎不像tkinter或任何库可以在GUI中执行此操作。有没有人知道tkinter是否以及如何做到这一点,或者是否有另一个能够进行这种现场情节的图书馆?

另外,在接收数据时,如何将收集的数据写入文件?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

看起来您通过轮询获取数据,这意味着您不需要线程或多个进程。只需在首选界面上轮询设备并绘制单点。

这是一个示例,其中包含一些模拟数据来说明一般概念。它每100毫秒更新一次屏幕。

import Tkinter as tk
import random

class ServoDrive(object):
    # simulate values
    def getVelocity(self): return random.randint(0,50)
    def getTorque(self): return random.randint(50,100)

class Example(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.servo = ServoDrive()
        self.canvas = tk.Canvas(self, background="black")
        self.canvas.pack(side="top", fill="both", expand=True)

        # create lines for velocity and torque
        self.velocity_line = self.canvas.create_line(0,0,0,0, fill="red")
        self.torque_line = self.canvas.create_line(0,0,0,0, fill="blue")

        # start the update process
        self.update_plot()

    def update_plot(self):
        v = self.servo.getVelocity()
        t = self.servo.getTorque()
        self.add_point(self.velocity_line, v)
        self.add_point(self.torque_line, t)
        self.canvas.xview_moveto(1.0)
        self.after(100, self.update_plot)

    def add_point(self, line, y):
        coords = self.canvas.coords(line)
        x = coords[-2] + 1
        coords.append(x)
        coords.append(y)
        coords = coords[-200:] # keep # of points to a manageable size
        self.canvas.coords(line, *coords)
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

答案 1 :(得分:0)

据我了解,可以使用tkinter / Qt / wxpython等来完成。您只需要使用mutlithreadingmultiprocessing。 使用另一个模块可能有一种更简单的方法,但我不知道它。

我长期以来一直在研究类似这个问题的东西,看来这是这个社区中一直存在的问题。

以下是一些讨论这个问题的主题:

How do I refresh a matplotlib plot in a Tkinter window?

How do I update a matplotlib figure while fitting a function?