我正在尝试编写一个 Python GUI,我需要做一个实时绘图。我目前有一个程序从我正在使用的机器接收数据,我希望能够在收到机器输出的值时绘制它们。我一直在研究,从我目前的发现来看,在我看来,tkinter 或任何库都不能在 GUI 中做到这一点。有谁知道 tkinter 是否以及如何做到这一点,或者是否有另一个库能够进行这样的实时绘图?
另外,当我收到数据时,我将如何将收集到的数据写入文件?
在此先感谢您的帮助。
我正在尝试编写一个 Python GUI,我需要做一个实时绘图。我目前有一个程序从我正在使用的机器接收数据,我希望能够在收到机器输出的值时绘制它们。我一直在研究,从我目前的发现来看,在我看来,tkinter 或任何库都不能在 GUI 中做到这一点。有谁知道 tkinter 是否以及如何做到这一点,或者是否有另一个库能够进行这样的实时绘图?
另外,当我收到数据时,我将如何将收集到的数据写入文件?
在此先感谢您的帮助。
看起来您通过轮询获取数据,这意味着您不需要线程或多个进程。只需在您喜欢的界面上轮询设备并绘制一个点。
这是一个带有一些模拟数据的示例,以说明总体思路。它每 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()
据我了解,它可以用 tkinter/Qt/wxpython 等来完成。你只需要使用mutlithreading
and multiprocessing
。使用另一个模块可能有更简单的方法,但我不知道。
很长一段时间以来,我一直在研究与此问题类似的问题,而且这似乎是这个社区中一直存在的问题。
以下是一些讨论该问题的线程: