python - 在 tkinter GUI 中更新 matplotlib 图

标签 python user-interface canvas matplotlib tkinter

我想在 tkinter GUI 中更新 matplotlib 图。我尝试在下面的代码示例中这样做。

import matplotlib
matplotlib.use('TkAgg')
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
import tkinter.ttk as ttk
import sys

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.createWidgets()

    def createWidgets(self):
       fig=plt.figure(figsize=(8,8))
       ax=fig.add_axes([0.1,0.1,0.8,0.8],polar=True)
       canvas=FigureCanvasTkAgg(fig,master=root)
       canvas.get_tk_widget().grid(row=0,column=1)
       canvas.show()

       self.plotbutton=tk.Button(master=root, text="plot", command=self.plot)
       self.plotbutton.grid(row=0,column=0)

    def plot(self):
       for line in sys.stdout: #infinite loop, reads data of a subprocess
           theta=line[1]
           r=line[2]
           ax.plot(theta,r,linestyle="None",maker='o')
           plt.show(block=False)
           plt.pause(0.001)
           plt.cla()
           #here set axes

root=tk.Tk()
app=Application(master=root)
app.mainloop()

目前的问题是,绘图函数中不知道 ax 对象。如果我尝试绘图(self,canvas,ax),GUI 不会打开。只有一个绘制数据的图。

我想绘制 GUI 中看到的图中的数据。刷新率至少在 3-5Hz 左右。 因为我是一个绝对的初学者,所以这个代码解决方案可能不是最好的方法。所以,如果有人能向我展示一个更聪明的解决方案,我会很高兴。

谢谢!

最佳答案

好的,我可以自己解决。解决方案如下:

import matplotlib
matplotlib.use('TkAgg')
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
import tkinter.ttk as ttk
import sys

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.createWidgets()

    def createWidgets(self):
        fig=plt.figure(figsize=(8,8))
        ax=fig.add_axes([0.1,0.1,0.8,0.8],polar=True)
        canvas=FigureCanvasTkAgg(fig,master=root)
        canvas.get_tk_widget().grid(row=0,column=1)
        canvas.show()

        self.plotbutton=tk.Button(master=root, text="plot", command=lambda: self.plot(canvas,ax))
        self.plotbutton.grid(row=0,column=0)

    def plot(self,canvas,ax):
        for line in sys.stdout: #infinite loop, reads data of a subprocess
            theta=line[1]
            r=line[2]
            ax.plot(theta,r,linestyle="None",maker='o')
            canvas.draw()
            ax.clear()
            #here set axes

root=tk.Tk()
app=Application(master=root)
app.mainloop()

关于python - 在 tkinter GUI 中更新 matplotlib 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30774281/

相关文章:

Python数据类,验证初始化参数的Python式方法是什么?

user-interface - 如何在Qt Creator中设置选项卡小部件的背景颜色?

eclipse - 我可以让 Ubuntu 上的 Eclipse 看起来更紧凑吗?

javascript - 单击 Canvas 中的对象时出现奇怪的错误?

c++ - 我如何在 python 中取消引用? (使用openCV进行图像处理)

python - 在 TensorFlow 中计算摘要时出错

从文本文件读取时的 Python 编码问题

java - 通过 JFrame 添加到 ArrayList 时出现 NullPointerException 错误

javascript - html5动画: canvas clearing works but everything is redrawn

android - 如何为 TextView 的每个字符设置阴影/发光效果