2016-08-24 57 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',那麼是的,我有。我只是不知道在這個問題是什麼:( –