2016-08-24 10 views
0

私は、複数のフレームを持つことによって、matplotlibをtkinterに組み込もうとしています。 StartPageのボタンをクリックすると、StartPageフレームのエントリ入力を渡して、GraphPageのプロットを更新する必要があります。したがって、の更新機能をStartPageのボタンにバインドしようとしていますが、更新機能には私が取得できないパラメータselfが必要です。ここに私のコードのセットアップが今だ:StartPagegpUpdate関数のあるクラスの '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() 

、私はselfとしてgraphPageを渡そうとしましたが、それはNoneTypeだというエラーを得ました。私もGraphPage.update(GraphPage)を試してみましたが、 'type object' GraphPage 'に' controller 'という属性がありません。

私の説明がはっきりしない場合は非常に申し訳ありませんが、私はPythonには新しく、今ボタンをクリックしてもまだそれを行うことができないので、GraphPageクラスに項目を渡すのに苦労しています...誰もこの問題で私を助けてくれますか?

ありがとうございました!

EDITは:提案へのコードのおかげへの変更:私は私の主な問題は、私はselfパラメータが

EDIT2 :(どうあるべきかわからないので、別のクラスであるクラスの機能を呼び出す方法だと思います:Iエントリに入力何かとボタンを押して、self.isoフィールドは空のまま残っているとき

def gpUpdate(self): 
    self.parent = PeakFitting() 
    self.grpage = GraphPage(self.parent.container, self.parent) 
    self.grpage.update() 
    self.controller.show_frame(GraphPage) 

しかし、...

+0

[tkinterの2つのフレーム間を切り替える](http://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter) –

+0

@ParvizKarimliその投稿はどのように切り替えるか教えてくれます私が既にしたフレーム...それは私が問題を持っている別のフレームから1つのフレームの関数を呼び出すでした:( –

答えて

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'を意味するのであれば、私は持っています。私はちょうどこの時点で問題が何かを知りません:( –

関連する問題