私は、複数のフレームを持つことによって、matplotlibをtkinterに組み込もうとしています。 StartPage
のボタンをクリックすると、StartPage
フレームのエントリ入力を渡して、GraphPage
のプロットを更新する必要があります。したがって、の更新機能をStartPage
のボタンにバインドしようとしていますが、更新機能には私が取得できないパラメータself
が必要です。ここに私のコードのセットアップが今だ:StartPage
でgpUpdate
関数のあるクラスの '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)
しかし、...
[tkinterの2つのフレーム間を切り替える](http://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter) –
@ParvizKarimliその投稿はどのように切り替えるか教えてくれます私が既にしたフレーム...それは私が問題を持っている別のフレームから1つのフレームの関数を呼び出すでした:( –