2016-10-30 43 views
0

私はこのプロットをpyplotに作成しました。このプロットには、データの特定の範囲を表示するスライダーがあります。私はplt.showでそれを表示したときに()がPython:tkinterのスライダー付きmatplotlibプロットを正しく埋め込む

import random 
import matplotlib 
import tkinter as Tk 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 

y_values = [random.randrange(20, 40, 1) for _ in range(40)] 
x_values = [i for i in range(40)] 

l, = plt.plot(x_values, y_values) 
plt.axis([0, 9, 20, 40]) 

ax_time = plt.axes([0.12, 0.1, 0.78, 0.03]) 
s_time = Slider(ax_time, 'Time', 0, 30, valinit=0) 


def update(val): 
    pos = s_time.val 
    ax.axis([pos, pos+10, 20, 40]) 
    fig.canvas.draw_idle() 
s_time.on_changed(update) 

#plt.show() 

matplotlib.use('TkAgg') 

root = Tk.Tk() 
root.wm_title("Embedding in TK") 

canvas = FigureCanvasTkAgg(fig, master=root) 
canvas.show() 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

Tk.mainloop() 

問題は、Tkinterのウィンドウに埋め込まれたときに、それが応答しなく思える、ある正常に動作する(この後のコードを意味し、コメントしています)。これを行う正しい方法は何ですか?

答えて

0

私はこれを考え出しました。プロットを作成する前に、Figureをキャンバスに追加する必要があります。

import random 
import matplotlib 
import tkinter as Tk 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

matplotlib.use('TkAgg') 

root = Tk.Tk() 
root.wm_title("Embedding in TK") 
fig = plt.Figure() 
canvas = FigureCanvasTkAgg(fig, root) 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

ax=fig.add_subplot(111) 
fig.subplots_adjust(bottom=0.25) 

y_values = [random.randrange(20, 40, 1) for _ in range(40)] 
x_values = [i for i in range(40)] 

ax.axis([0, 9, 20, 40]) 
ax.plot(x_values, y_values) 

ax_time = fig.add_axes([0.12, 0.1, 0.78, 0.03]) 
s_time = Slider(ax_time, 'Time', 0, 30, valinit=0) 


def update(val): 
    pos = s_time.val 
    ax.axis([pos, pos+10, 20, 40]) 
    fig.canvas.draw_idle() 
s_time.on_changed(update) 

Tk.mainloop() 
関連する問題