【问题标题】:Python: Embed a matplotlib plot with slider in tkinter properlyPython:在 tkinter 中正确嵌入带有滑块的 matplotlib 图
【发布时间】:2016-10-30 01:42:17
【问题描述】:

我在 pyplot 中创建了这个图,它有一个滑块来查看一定范围的数据。

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 窗口中时似乎没有响应,尽管当我使用 plt.show() 显示它时(意味着在此之后的代码被注释)工作正常。这样做的正确方法是什么?

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案1】:

    我想出了这个。在创建绘图之前,需要将图形添加到画布中。

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

    【讨论】:

    • 两天来一直试图弄清楚如何做这样的事情。谢谢。
    • @fishbacp 乐于助人。我记得这让我疯狂了好几天......
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多