2017-01-17 10 views
0

私持っている私は(他のフレームをオーバーラップ以上)の問題もなくページを変更することができ、次のコード:Pythonの3 - Tkinterの変更ページのパスの余分なパラメータ

class HFlair(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(10, weight=1) 
     container.grid_columnconfigure(10, weight=1) 

     self.frames = {} 
     for F in (StartPage, PageOne, PageTwo, PageThree): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 
     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.title=tk.Frame(self) 
     self.title.pack(side="top") 
     self.menu=tk.Frame(self) 
     self.menu.pack(side="top") 
     self.sub_title=tk.Frame(self) 
     self.sub_title.pack(side="top") 
     self.app1=tk.Frame(self) 
     self.app1.pack(side="left") 

     label = tk.Label(self.title, text="HFlair Home", font=TITLE_FONT) 
     label.pack(side="top", fill="x", pady=10) 
     button1 = tk.Button(self.menu, text="Membri",command=lambda: self.controller.show_frame("PageOne")) 
     button2 = tk.Button(self.menu, text="Spese",command=lambda: self.controller.show_frame("PageTwo")) 
     button3 = tk.Button(self.menu, text="Nuovo Membro",command=lambda: self.controller.show_frame("PageThree")) 
     button1.pack(side="left") 
     button2.pack(side="left") 
     button3.pack(side="left") 
     label1 = tk.Label(self.sub_title, text="Membri che non hanno pagato l'iscrizione:", font=text_font) 
     label1.pack(side="top", fill="x", pady=10) 
     c=table(self.app1,self.controller,'home') 

私は最初のものに似た複数のページを持っています、私はちょうどほぼ同じなので、コードをコピーしていない。

あなたは、私がクリック時に私がページを変更する別のボタンを持って見ることができる場合は、次の

tk.Button(self.menu, text="Spese",command=lambda: self.controller.show_frame("PageTwo")) 

を今私の問題は、私は私を返す機能整数を持っていると私は、この値を渡して新しいページを呼び出す必要があるということです。 私は他のすべてを呼び出すために使用するのと同じ方法でページを呼び出そうが、私はそれは、余分な値(整数)で動作することができません。

self.controller.show_frame("PageTwo",4) 

問題があるたびにそのこと新しいページのクラスのオプションとして新しいパラメータがありました。私のコードはHflairクラスで失敗します。

私はメインクラス(クラスHflair)でオプションの追加パラメータを渡そうとしますが、私のコードはまだ失敗します。

誰かが、1ページ分の余分なパラメータを紹介する方法を教えてください。

私はちょうど私のページのコールに新しいパラメータを追加すると、私はこの行にこのエラーが表示されます。

frame = F(parent=container, controller=self)

init() missing 1 required positional argument: 'attr'

私はこのようにオプションパラメータを追加する場合:

frame = F(parent=container, controller=self, attr=None) 

このエラーが表示されます:

init() got an unexpected keyword argument 'attr'

私はいくつかばかげたミスをしていると思うが、どこに行けないのだろうか:

申し訳ありませんが、私はTkinterの新しいです。あなたは余分な引数で関数を呼び出す場合

+0

'show_page'に

for F, arg in ((StartPage, 4), (PageOne, 1), (PageTwo, None), (PageThree, None)): page_name = F.__name__ frame = F(parent=container, controller=self) if arg: frame.arg = arg # or frame.some_function(arg) 

、その後、必要のない引数をshow_frameするために同様に使用?他のページが既に作成されていることは承知していますか?この価値をどのように期待していますか? –

+0

フレームの切り替えに関するその他の質問をすべて読んだことがありますか?ここから始めてください:http://stackoverflow.com/a/7557028/7432 –

+0

こんにちは@BryanOakleyので、ページは作成されていましたが、黒で作成されています。私は何をしたいのかの例を作っています。私はDB内のユーザーが違うので、ページとユーザーIDを渡し、DBからすべての情報を動的に取得します。ユーザープロフィール!私は間違っているのですか? –

答えて

2

self.controller.show_frame("PageTwo",4) 

が、あなたは追加の引数を持つ関数/メソッドを定義する必要が助けを事前にそうそんなに

おかげ

def show_frame(self, page_name, arg): 

かデフォルト値でより普遍的なので、特別な引数を付けてもしなくてもshow_frame()と呼ぶことができます

def show_frame(self, page_name, arg=None): 

そしてshow_frame()に、あなたは、この引数

すなわちで何かをしなければなりません。

def show_frame(self, page_name, arg=None): 
    '''Show a frame for the given page name''' 
    frame = self.frames[page_name] 
    frame.tkraise() 

    if arg: 
     frame.arg = arg 
     # or 
     frame.some_function(arg) 

あなたはフレーム

frame = F(parent=container, controller=self, attr=some_value) 

を作成するときに引数を使いたいなら、あなたは追加の引数を持つすべてのページ

class StartPage(tk.Frame): 
    def __init__(self, parent, controller, attr=None): 

class PageOne(tk.Frame): 
    def __init__(self, parent, controller, attr=None): 

class PageTwo(tk.Frame): 
    def __init__(self, parent, controller, attr=None): 

を定義する必要がありますが、あなたは余分を使用する必要があります引数はforループ

すなわち、

すなわち。

for F, arg in ((StartPage, 4), (PageOne, 1), (PageTwo, None), (PageThree, None)): 
     page_name = F.__name__ 
     frame = F(parent=container, controller=self, attr=arg) 

またはF(...)に、あなたはあなたがに値を渡す場合に起こることを期待し何__init__(...)

+0

すごくいいですね。 –

関連する問題