我试图通过拥有多个帧将matplotlib合并到tkinter中。我需要传递来自StartPage
框架的条目输入,以便在点击GraphPage
中的按钮后更新StartPage
中的图表。因此,我正在尝试将GraphPage
的更新函数绑定到StartPage
中的按钮,但更新函数需要self
参数,这是我无法获得的。这是我现在设置的代码:
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk
class PeakFitting(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, GraphPage):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def get_page(self, classname):
'''Returns an instance of a page given it's class name as a string'''
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
return None
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
# Setting up frame and widget
self.entry1 = tk.Entry(self)
self.entry1.grid(row=4, column=1)
button3 = ttk.Button(self, text="Graph Page",
command=self.gpUpdate())
button3.grid(row=7, columnspan=2)
def gpUpdate(self):
graphPage = self.controller.get_page("GraphPage")
GraphPage.update(graphPage)
self.controller.show_frame("GraphPage")
class GraphPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
fig = Figure(figsize=(5, 5), dpi=100)
self.a = fig.add_subplot()
canvas = FigureCanvasTkAgg(fig, self)
canvas.show()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, self)
toolbar.update()
canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
startpage = self.controller.get_page("StartPage")
def update(self):
startpage = self.controller.get_page("StartPage")
self.iso = startpage.entry1.get()
##Calculation code for analysis not needed for question
app = PeakFitting()
app.mainloop()
gpUpdate
中的StartPage
函数,我尝试将graphPage
作为self
传递,但得到的错误是NoneType
。我也试过GraphPage.update(GraphPage)
但得到'类型对象'GraphPage'没有属性'controller''错误。
我很抱歉,如果我的解释不清楚,但我对Python很陌生,并且在点击按钮后仍然无法完成将数据传递给GraphPage类几周。 ..任何人都可以帮我解决这个问题吗?
非常感谢!!!
编辑:我想我的主要问题是如何在另一个类中调用一个类的函数,因为我不知道self
参数应该是什么:(
EDIT2:感谢建议改为代码:
def gpUpdate(self):
self.parent = PeakFitting()
self.grpage = GraphPage(self.parent.container, self.parent)
self.grpage.update()
self.controller.show_frame(GraphPage)
但是,当我在条目中输入内容并点击按钮时,self.iso
字段仍为空...
答案 0 :(得分:3)
这是问题所在:
GraphPage.update(graphPage)
您可以在类本身上调用该方法。您需要创建该类的实例,然后使用父级和控制器调用update
方法,例如:
self.grpage = GraphPage(parent, controller)
然后:
self.grpage.update()
除此之外,还有另一个问题in button3
- 更改此内容:
command=self.gpUpdate()
到此:
command=self.gpUpdate
没有括号。这是一个传递给按钮的函数,将在单击按钮时调用。