gpt4 book ai didi

python - Funcanimation 无法在Figcanvas 内工作

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:10 25 4
gpt4 key购买 nike

我想构建一个带有某些实时图表的界面,显示一些实验的结果。为此,我决定结合使用glade(UI)、gtk、python 和 matplotlib。我正在学习一些基础知识,并且能够绘制一些实时图表。

现在,我在使用 Funcanimation 进行实时动画时遇到了一些问题。下面,代码导入一个带有四个滚动窗口的林间空地文件,我想在每个滚动窗口中显示一些动画。我厌倦了动画而没有在 Canvas 内(滚动窗口内)绘制,并且它有效!但是当我尝试运行它时,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()

最佳答案

非常感谢@ImportanceOfBeingErnest deserves credit基本上这篇文章中所有正确的内容:)

这是代码的稍微修改后的可运行版本(没有 Glade),它在 GTK 应用程序中使用 FuncAnimation。

需要注意的三件事:

  • A reference to the FuncAnimation object must be kept以免对象(及其计时器)被垃圾收集。

  • FigureCanvas应在 FuncAnimation 之前创建,自 FuncAnimation通过调用 fig.canvas.new_timer() 创建一个计时器。如果 Canvas 尚未创建,fig.canvas是 None ,你会得到 AttributeError .

  • 如果 Gtk 不是您的默认后端,请使用 matplotlib.figure.Figure而不是plt.figure在这里。

<小时/>
import numpy as np
from gi.repository import Gtk
from gi.repository import GObject
from matplotlib.figure import Figure
from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class MyApp(object):
def __init__(self):
window = Gtk.Window()
window.connect("delete-event", Gtk.main_quit)
window.set_default_size(400, 400)
sw = Gtk.ScrolledWindow()
window.add(sw)

self.fig = fig = Figure()
self.canvas = FigureCanvas(fig)
sw.add_with_viewport(self.canvas)

ax = fig.add_subplot(111)
data = np.zeros(100)
self.line, = ax.plot(data, 'r-')
ax.set_ylim(-1, 1)
self.ani = animation.FuncAnimation(
self.fig, self.update_line, interval=100, frames=50, repeat=True)

window.show_all()

def update_line(self, *args):
data = 2*(np.random.random(100)-0.5)
self.line.set_ydata(data)
self.canvas.draw()
return True

if __name__ == "__main__":
app = MyApp()
Gtk.main()

关于python - Funcanimation 无法在Figcanvas 内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com