2016-08-24 96 views
0

我试图通过使用多个框架将matplotlib并入到tkinter中。一旦点击了StartPage中的按钮,我需要通过StartPage框架的输入输入来更新GraphPage中的图。因此,我试图将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,我试图通过graphPageself,却得到了一个错误,这是一个NoneType。我也尝试GraphPage.update(GraphPage),但得到'类型对象'GraphPage'没有属性'控制器''错误。

如果我的解释不清楚,我非常抱歉,但我对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

可能重复的[tkinter中两帧之间切换](http://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter) –

+0

@ParvizKarimli该帖子告诉我如何切换我已经做过的帧...这是从另一帧调用一个帧的功能,我有问题:( –

回答

3

这就是问题所在:

GraphPage.update(graphPage) 

您可以调用类本身的方法。你需要创建一个类的实例,然后调用update方法与父母和控制器,例如:

self.grpage = GraphPage(parent, controller) 

然后:

self.grpage.update() 
从这个

除此之外,你有一个问题in button3 - 更改此:

command=self.gpUpdate() 

这样:

command=self.gpUpdate 

没有括号。这是一个你传递给按钮的函数,并且在按钮点击时被调用。

+0

非常感谢你!这确实摆脱了错误,这真是太棒了!但是,现在'GraphPage'中的'update'函数运行了,出于某种原因,即使我在点击按钮之前输入了一个字符串,'self.iso'字段仍然是空字符串,可能是错误的吗?非常感谢! !(我把代码的更新放在编辑部分:)) –

+0

你是否将'command = self.gpUpdate()'改为'command = self.gpUpdate()'? –

+0

如果你打算'self.gpUpdate',那么是的,我有。我只是不知道在这个问题是什么:( –

相关问题