【问题标题】:Plot graph with pyplot using input from tkinter spinbox使用来自 tkinter spinbox 的输入使用 pyplot 绘制图形
【发布时间】:2018-05-29 01:22:04
【问题描述】:

我正在一个项目中工作,该项目需要随着 tkinter spinbox 中的输入发生变化而动态绘制图形。

我有一个示例代码:

from tkinter import *
from tkinter import font
from tkinter.font import Font
from tkinter import messagebox
print("'Tkinter' module is found as tkinter.")

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
print("Importing matplotlib from libraries.")


master = Tk()

def ok(x_val=1000,y_val=20):
         fig = Figure(figsize=(5,5),dpi=70)
         ax = fig.subplots()
         ax.set_title("Right Ear")
         ax.set_ylabel("db HL")
         ax.set_xlabel("Frequency")
         ax.set_xlim(100,9000)
         ax.set_ylim(130,-10)
         ax.set_facecolor("#ffd2d2")

         x = [125,250,500,1000,2000,4000,8000]
         ticks = [125,250,500,"1K","2K","4K","8K"]
         xm = [750,1500,3000,6000]

         ax.set_xscale('log', basex=2)
         ax.set_xticks(x)
         ax.set_xticks(xm, minor=True)
         ax.set_xticklabels(ticks)
         ax.set_xticklabels([""]*len(xm), minor=True)


         ax.yaxis.set_ticks([120,110,100,90,80,70,60,50,40,30,20,10,0,-10])


         ax.plot([x_val],[y_val],'r+',markersize=15.0,mew=2)
         ax.grid(color="grey")
         ax.grid(axis="x", which='minor',color="grey", linestyle="--")
         canvas = FigureCanvasTkAgg(fig, master=master)
         canvas.show()
         canvas.get_tk_widget().grid(column=0,row=2,columnspan=3,rowspan=15)

def action():
        print(spin.get())
        canvas.draw()
        ok(spin.get(),10)

spin = Spinbox(master, from_=125,to=8000,command=action)
spin.grid(column=5,row=2)

ok()

这段代码没有改变情节,我不明白怎么改变它,确切地说,如何在这里使用canvas.draw()来完成工作。 spinbox 的值范围从 125 到 8000,我不知道如何在 spinbox 每次更改时获取它的值(可以使用command=,但如何实现)并将其提供给ax.plot() 的 x 轴和动态绘制。随着 spinbox 的值变化,绘图也更改为新位置,并从先前位置删除先前绘图。

【问题讨论】:

    标签: python matplotlib plot tkinter


    【解决方案1】:

    您需要使所需的变量可用。通常的方法是使用一个类并制作这些类变量。然后可以从类内部 (self) 或外部作为属性访问它们。

    from Tkinter import *
    
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
    
    class PlotClass():
        def __init__(self):
             fig = Figure(figsize=(5,5),dpi=70)
             ax = fig.subplots()
             ax.set_title("Right Ear")
             ax.set_ylabel("db HL")
             ax.set_xlabel("Frequency")
             ax.set_xlim(100,9000)
             ax.set_ylim(130,-10)
             ax.set_facecolor("#ffd2d2")
    
             x = [125,250,500,1000,2000,4000,8000]
             ticks = [125,250,500,"1K","2K","4K","8K"]
             xm = [750,1500,3000,6000]
    
             ax.set_xscale('log', basex=2)
             ax.set_xticks(x)
             ax.set_xticks(xm, minor=True)
             ax.set_xticklabels(ticks)
             ax.set_xticklabels([""]*len(xm), minor=True)
    
             ax.yaxis.set_ticks([120,110,100,90,80,70,60,50,40,30,20,10,0,-10])
    
             self.line, = ax.plot([],[],'r+',markersize=15.0,mew=2)
             ax.grid(color="grey")
             ax.grid(axis="x", which='minor',color="grey", linestyle="--")
             self.canvas = canvas = FigureCanvasTkAgg(fig, master=master)
             canvas.show()
             canvas.get_tk_widget().grid(column=0,row=2,columnspan=3,rowspan=15)
             self.spin = Spinbox(master, from_=125,to=8000,command=self.action)
             self.spin.grid(column=5,row=2)
    
        def ok(self, x=1000,y=20):
            self.line.set_data([x],[y])
            self.canvas.draw_idle()
    
        def action(self):
            self.ok(float(self.spin.get()),10)
    
    master = Tk()
    plotter = PlotClass()
    plotter.ok(125,10)
    master.mainloop()
    

    注意:在较新版本的 matplotlib 中,您应该使用 NavigationToolbar2Tk 而不是 NavigationToolbar2TkAgg

    【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2022-07-05
    • 2022-06-25
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多