2015-06-11 2 views
3

Я хочу обновить график matplotlib в графическом интерфейсе tkinter. Я попытался сделать это в следующем примере кода.update matplotlib plot in tkinter GUI

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

В настоящий момент проблема заключается в том, что объект топора не известен в функции графика. Если я попробую сюжет (self, canvas, ax), GUI не откроется. Только фигура, которая отображает данные.

Я хочу отобразить данные на рисунке, который отображается в графическом интерфейсе. По крайней мере, частота обновления около 3-5 Гц. Потому что я - абсолютный новичок, это решение кода, вероятно, не самый лучший способ сделать это. Поэтому я был бы счастлив, если бы кто-то мог показать мне более разумное решение.

Спасибо!

ответ

3

Хорошо, я мог бы решить это сам. Здесь решение:

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

Спасибо Abishek за то, что нашли время, чтобы опубликовать ответ на вашу собственную проблему.

Я только немного изменил ваш ответ, чтобы он работал как автономный модуль без ввода данных из sys.stdout. Также был изменен импорт tkinter для python 2.7

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