[英]Matplotlib in Tkinter
我试图在tkinter中使用Matplotlib绘制图形。 此处,该图应绘制0-24范围内的所有“ a”值。 我的代码如下
import math
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
def att_func(d=0, n=0, z=0):
# Getting User inputs from the UI
d = d_user.get()
n = n_user.get()
z = z_user.get()
a = (-9.87 * math.sin(2 * ((2 * math.pi * (d - 81)) / 365)) + n * z)
a_label.configure(text=a)
return (a)
#Plotting the graph
class App:
def __init__(self, master):
frame = tkinter.Frame(master)
self.nbutton_graph = tkinter.Button(frame, text="Show Graph", command=self.graph)
self.nbutton_graph.pack()
f = Figure(figsize=(5, 5), dpi=100)
ab = f.add_subplot(111)
self.line, = ab.plot(range(24))
self.canvas = FigureCanvasTkAgg(f, self)
self.canvas.show()
self.canvas.get_tk_widget().pack()
def graph(self):
day_elevation_hrs = []
for i in range(24):
day_elevation_hrs.append(att_func(i, 0, 0)[0])
self.canvas.draw()
return
root = tkinter.Tk()
app = App(root)
# User Inputs
d_user = IntVar()
n_user = DoubleVar()
z_user = DoubleVar()
nlabel_d = Label(text="Enter d").pack()
nEntry_d = Entry(root, textvariable=d_user).pack()
nlabel_n = Label(text="Enter n").pack()
nEntry_n = Entry(root, textvariable=n_user).pack()
nlabel_z = Label(text="Enter z").pack()
nEntry_z = Entry(root, textvariable=z_user).pack()
# Displaying results
nlabel_a = Label(text="a is").pack()
a_label = Label(root, text="")
a_label.pack()
root.mainloop()
在这里,我能够计算出我所需要的。 但是,当我尝试绘制相同的内容时,我无法。 我尝试了尽可能多的修改。 但似乎是一个陈旧的伴侣。 我确定我在某处出错。 但不知道在哪里。
当我尝试使用matplotlib绘制相同的图时,没有tkinter时,它可以工作。 但是当我尝试在带有tkinter的UI中执行此操作时,我无法进行操作。这是在没有tkinter的情况下在matplotlib中绘制图形的代码。
import matplotlib.pylab as pl
day_elevation_hrs=[]
for i in range(24):
day_elevation_hrs.append(att_func(i, 0, 0)[0])
pl.title("Elevation of a in range i")
pl.plot(day_elevation_hrs)
您的代码不会按发布的方式运行,但是我可以看到两个明确的问题。
首先,您的App
是一个包含画布的框架,但是您永远不会将其添加到根窗口中。 因此,您的画布将不可见。
创建App
实例后,添加以下代码:
app.pack(side="top", fill="both", expand=True)
其次,在定义用于显示图形的按钮时,您经常犯错误。 command
属性引用一个函数。 但是,您正在调用 graph()
函数,并将结果用作command
属性的值。
换句话说,更改此:
self.nbutton_graph = Tk.Button(self, text="Show Graph", command=self.graph())
对此:
self.nbutton_graph = Tk.Button(self, text="Show Graph", command=self.graph)
注意self.graph
之后缺少()
。 这可能是为什么看到诸如'App' object has no attribute 'line'
类'App' object has no attribute 'line'
错误'App' object has no attribute 'line'
,因为在完全初始化所有变量之前调用了graph函数。
此文档显示FigureCanvasTkAgg.__init__
的第二个显式参数应该是主参数。 (这实际上是一个关键字参数。)
因此,您是否尝试过将该行更改为...
self.canvas = FigureCanvasTkAgg(f, master=master)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.