【问题标题】:update matplotlib plot in tkinter GUI在 tkinter GUI 中更新 matplotlib 图
【发布时间】:2015-08-26 18:20:41
【问题描述】:

我想在 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 对象。如果我尝试 plot(self,canvas,ax) GUI 不会打开。只是一个绘制数据的图。

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

谢谢!

【问题讨论】:

    标签: python user-interface canvas matplotlib tkinter


    【解决方案1】:

    感谢 Abishek 抽出宝贵时间发布您自己问题的答案。

    我刚刚修改了您的答案,使其作为独立模块运行,无需来自 sys.stdout 的输入。还更改了 python 2.7 的 tkinter 导入

    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  # python 2.7
    import ttk            # python 2.7
    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):
            c = ['r','b','g']  # plot marker colors
            ax.clear()         # clear axes from previous plot
            for i in range(3):
                theta = np.random.uniform(0,360,10)
                r = np.random.uniform(0,1,10)
                ax.plot(theta,r,linestyle="None",marker='o', color=c[i])
                canvas.draw()
    
    root=tk.Tk()
    app=Application(master=root)
    app.mainloop()
    

    【讨论】:

      【解决方案2】:

      好的,我可以自己解决。这里的解决方案:

      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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-05
        • 2022-08-13
        • 2021-12-04
        • 1970-01-01
        • 2011-05-03
        • 2023-03-24
        • 2014-09-26
        • 2021-09-01
        相关资源
        最近更新 更多