python Matplotlib gtk - 使用 FuncAnimation 绘制动画图

标签 python animation matplotlib gtk

我正在尝试使用 FunkAnimation 更新 GTK 窗口中的绘图。 我想单击一个按钮开始更新从 txt 文件获取数据的绘图。 txt 文件不断更新。目的是绘制温度曲线。这是简化的代码:

import gtk
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
import matplotlib.animation as animation
from matplotlib import pyplot as plt

class MyProgram():
    def __init__(self):
        some_gtk_stuff
        self.signals = {
                'on_button_clicked': self.create_plot,
        }
        self.builder.connect_signals(self.signals)

        self.vbox = self.builder.get_object('vbox')

        self.figure = plt.figure()
        self.axis = self.figure.add_subplot(1,1,1)
        self.init = 0

    def create_plot(self):                        
        def update_plot(i):
            #read SampleData from txt File
            x = []
            y = []
            readFile = open('SampleData.txt', 'r')
            sepFile = readFile.read().split('\n')
            readFile.close()

            for data in sepFile:
                xy = data.split(',')
                x.append(int(x)
                y.append(int(y)

            self.axis.plot(x, y)

            if (self.init == 0):
                self.canvas = FigureCanvas(self.figure)
                self.vbox.pack_start(self.canvas)
                self.canvas.show()

            ani = animation.FuncAnimation(self.figure, update_plot, interval = 1000)
            self.canvas.draw()
            return ani

MyProgram()
gtk.main()

所以我猜问题是 create_plot 函数只被调用一次。绘图窗口是在 GUI 中创建的,但没有更新。我找不到解决我的问题的方法。按照建议添加“返回任何”here没用。

您可以看到一个工作示例 here ,代码位于页面底部。

我知道我必须实现诸如线程之类的东西来稍后进行日志记录和更新,但如果没有它我什至无法让它工作。

有什么建议吗? :)

最佳答案

我认为这就是您想要实现的目标。请注意,我改变了您阅读文件的方式。 with open() as f: 负责处理您忘记的文件关闭操作。还可以在构建器文件中写入信号处理程序的名称,这样就可以简单地说 self.builder.connect(self) 并省略 self.signals 字典.

import gtk
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
import matplotlib.animation as animation
from matplotlib import pyplot as plt

class MyProgram():
    def __init__(self):
        #some_gtk_stuff
        self.signals = {
                'on_button_clicked': self.create_plot,
        }
        self.builder.connect_signals(self.signals)

        self.vbox = self.builder.get_object('vbox')

        self.figure = plt.figure()
        self.axis = self.figure.add_subplot(1,1,1)
        self.canvas = None

    def create_plot(self, button):
        self.ani = animation.FuncAnimation(self.figure, self.update_plot, interval = 1000)


    def update_plot(self, i):
        #read SampleData from txt File
        x = []
        y = []
        with open('SampleData.txt') as f:
            x_raw, y_raw = f.readline().strip().split(',')
            x.append(int(x_raw))
            y.append(int(y_raw))

        self.axis.plot(x, y)

        if not self.canvas:
            self.canvas = FigureCanvas(self.figure)
            self.vbox.pack_start(self.canvas)
            self.canvas.show()

        self.canvas.draw()

MyProgram()
gtk.main()

关于python Matplotlib gtk - 使用 FuncAnimation 绘制动画图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828650/

相关文章:

python - Flask Rest API 版本控制 - 返回的 URL

python - 将特定位置的字符串替换成文本,然后重写所有文本

python - 如何在cv2.warp方法中获取扭曲了 “from no where”的像素的蒙版?

python - 在 Turtle 中不设置动画 - Python 3.4?

python连续请求: can I use s. mount()?

ios - 如何禁用 CALayer 隐式动画?

javascript - 我可以多次调用 requestAnimationFrame 吗?

Python:绘制时间增量和累积值

python - 在 jupyter 笔记本中同时使用 matplotlib inline 和 qt

Python matplotlib tkinter - 按钮不更新图形