2017-05-17 33 views
1

tkinterウィンドウでmatplotlibで何かをグラフ表示しようとすると、単に表示されません。 tkinter固有の部分を削除して、基本的なplt.plot(...)とplt.show()を実行すると、それは通常のテキスト出力フィールドに表示されます。しかし、この場合、私はそれをtkinterウィンドウに表示したいと思います。私はこれをmac(MacOS 10.12.4)で実行しているからだと信じていますが、tkinterウィンドウに表示する方法を理解できません。matplotlibグラフがtkinterウィンドウに表示されない

import numpy as np 
import Tkinter as tk 

import matplotlib 
matplotlib.use('TkAgg') 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
import matplotlib.pyplot as plt 

root = tk.Tk() 

fig = plt.figure(1) 
t = np.arange(0.0,3.0,0.01) 
s = np.sin(np.pi*t) 
plt.plot(t,s) 

canvas = FigureCanvasTkAgg(fig, master=root) 
plot_widget = canvas.get_tk_widget() 

def update(): 
    s = np.cos(np.pi*t) 
    plt.plot(t,s) 
    plt.show() 

plot_widget.grid(row=0, column=0) 
tk.Button(root,text="Update",command=update).grid(row=1, column=0) 
root.mainloop() 

私が言ったように、私はMacOS上で動作していると考えています。また、私はこれを実行すると、空のtkinterウィンドウが更新ボタンで表示されますが、グラフは表示されません。 Graph Doesは通常のテキスト出力に表示されますが、GUI用のtkinterウィンドウに表示します。助けてください!

答えて

1

plt.show()で新しいものを表示するのではなく、すでにtkキャンバスにある図形を更新する必要があります。この場合、図が1つしか開いていないので、実際にはplt.plot()が機能します(より複雑なシナリオでは失敗する可能性があります)。残っているのは、プロット後にキャンバスを描くことです(fig.canvas.draw_idle())。将来のために

import numpy as np 
import Tkinter as tk 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
import matplotlib.pyplot as plt 

root = tk.Tk() 

fig = plt.figure(1) 
t = np.arange(0.0,3.0,0.01) 
s = np.sin(np.pi*t) 
plt.plot(t,s) 

canvas = FigureCanvasTkAgg(fig, master=root) 
plot_widget = canvas.get_tk_widget() 

def update(): 
    s = np.cos(np.pi*t) 
    plt.plot(t,s) 
    fig.canvas.draw_idle() 

plot_widget.grid(row=0, column=0) 
tk.Button(root,text="Update",command=update).grid(row=1, column=0) 
root.mainloop() 

とGUIにmatplotlibのを埋め込む際pyplotを使用して回避しようと、サイドを救うになります。これにより、ここで報告されたような問題が発生しないようにします。

import numpy as np 
import Tkinter as tk 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 

root = tk.Tk() 

fig = Figure() 
ax = fig.add_subplot(111) 
t = np.arange(0.0,3.0,0.01) 
s = np.sin(np.pi*t) 
ax.plot(t,s) 

canvas = FigureCanvasTkAgg(fig, master=root) 
plot_widget = canvas.get_tk_widget() 

def update(): 
    s = np.cos(np.pi*t) 
    ax.plot(t,s) 
    fig.canvas.draw_idle() 

plot_widget.grid(row=0, column=0) 
tk.Button(root,text="Update",command=update).grid(row=1, column=0) 
root.mainloop() 
関連する問題