簡體   English   中英

python Matplotlib gtk - 使用 FuncAnimation 繪制動畫圖

[英]python Matplotlib gtk - animate plot with FuncAnimation

我正在嘗試使用 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 中創建,但不會更新。 我找不到解決我的問題的方法。 按照此處的建議添加“返回任何”不起作用。

你可以在這里看到一個工作示例,代碼在頁面底部。

我知道我必須為以后的日志記錄和更新實現諸如線程之類的東西,但我什至沒有讓它工作。

有小費嗎? :)

我認為這就是您想要實現的目標。 請注意,我更改了您閱讀文件的方式。 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM