如何将一个类的'self'参数传递给另一个类

时间:2016-08-24 22:13:24

标签: python python-3.x matplotlib tkinter

我试图通过拥有多个帧将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字段仍为空...

1 个答案:

答案 0 :(得分:3)

这是问题所在:

GraphPage.update(graphPage)

您可以在类本身上调用该方法。您需要创建该类的实例,然后使用父级和控制器调用update方法,例如:

self.grpage = GraphPage(parent, controller)

然后:

self.grpage.update()

除此之外,还有另一个问题in button3 - 更改此内容:

command=self.gpUpdate()

到此:

command=self.gpUpdate

没有括号。这是一个传递给按钮的函数,将在单击按钮时调用。