【发布时间】:2018-02-07 02:39:28
【问题描述】:
我想构建一个界面,其中包含显示某些实验结果的某些实时图表。为此,我决定使用 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()
【问题讨论】:
-
那么您是否尝试从函数中返回 funcanimation 并将
Gtk.main()放在外面? -
@unutbu 因为每个 GUI 都使用事件循环,所以我不清楚这个论点。为什么
FuncAnimation只能在任何其他 GUI 中工作,而不是 GTK? GTK 有什么特别之处会阻止FuncAnimation工作? -
@unutbu 抱歉,但您所说的基本上是不可能在 GTK GUI 中使用
FuncAnimation。这显然是错误的。可能涉及的特殊性使得它更难使用,但没有什么可以阻止它被使用。或者,如果存在,这将是一个错误,需要进行调查。 -
你好(因为我不能同时标记你),正如 ImportanceOfBeingErnest 所说,我不能调用 plt.show() 因为我调用了我自己的 Gtk GUI
标签: python matplotlib pygtk gtk3 glade