我想 Build 一个界面,其中包含一些显示某些实验结果的实时图表 . 为此,我决定使用glade(UI),gtk,python和matplotlib的组合 . 我正在使用一些基础知识,我能够绘制一些实时图表 .
现在,我在使用Funcanimation进行实时动画时遇到了一些麻烦 . 下面,代码导入一个带有四个滚动窗口的glade文件,我想在每个滚动的窗口中显示一些动画 . 我没有在画布里面(在滚动窗口内)绘图而累了动画而且它有效!但是当我试图运行它时,Funcanimation(update_line)的回调函数甚至没有触发 . 实际上我在这里做错了什么 . 我也是python的新手 .
谢谢
#!/usr/bin/env python
import sys
import os
import time
import psutil as p
import threading
import numpy as np
from gi.repository import Gtk
from gi.repository import GObject
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas
import matplotlib.pyplot as plt
class windowSignals:
def on_mainWindow_destroy(self, widget):
Gtk.main_quit()
def main():
builder = Gtk.Builder()
builder.add_from_file("window.glade")
builder.connect_signals(windowSignals())
window = builder.get_object("mainWindow")
sw = builder.get_object("scrolledWindow1")
def update_line(num, data, line):
data.pop(0)
data.append(np.random.random())
line.set_ydata(data)
return line,
fig1 = plt.figure()
data = [0.0 for i in xrange(100)]
l, = plt.plot(data, 'r-')
plt.ylim(-1, 1)
line_ani = animation.FuncAnimation(fig1, update_line, 25, fargs=(data, l), interval=50, blit=True)
can = FigureCanvas(fig1)
sw.add_with_viewport(can)
can.draw()
window.show_all()
Gtk.main()
if __name__ == "__main__":
main()
1 回答
非常感谢@ImportanceOfBeingErnest谁deserves credit基本上在这篇文章中正确的一切:)
这是一个稍微修改过的可运行版本的代码(没有Glade),它在GTK应用程序中使用FuncAnimation .
需要注意三点:
A reference to the FuncAnimation object must be kept以免对象(及其计时器)进行垃圾回收 .
FigureCanvas
应该在FuncAnimation
之前创建,因为FuncAnimation
通过调用fig.canvas.new_timer()
来创建一个计时器 . 如果尚未创建画布,fig.canvas
为无,您将获得AttributeError
.如果Gtk不是您的默认后端,请在此处使用
matplotlib.figure.Figure
而不是plt.figure
.