pythongui曲线_Python GUI中的实时绘图

I am trying to write a Python GUI and I need to do a live plot. I currently have a program that receives data from a machine I am using and I want to be able to plot the values the machine outputs as I receive them. I have been researching and from what I have found so far, it doesn't seem to me like tkinter or any library can do this in a GUI. Does anyone know whether and how tkinter can do this or if there is another library that is capable of doing such a live plot?

Also, how would I go about writing the data that I gather to a file as I receive the data?

Thanks in advance for your help.

解决方案

It looks like you get the data by polling, which means you don't need threads or multiple processes. Simply poll the device at your preferred interface and plot a single point.

Here's an example with some simulated data to illustrate the general idea. It updates the screen every 100ms.

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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值