2016-12-18 10 views
0

ので、このstackoverflowの質問があります:別のフレームの情報を表示していますか? (Tkinterのパイソン)

Switch between two frames in tkinter

アプリケーションを構築するための美しい根拠のように見えます。しかし、もしstartPage上で私は複数のボタンを持っていて、PageOneに適切なデータを表示したいのですが?ここに私の試みです:

import tkinter as tk 
from functools import partial 

characters = {"character1": "abc", "character2": "def", "character3": "ghi", "character4": "jkl", "character5": "mnp", "character6": "qrs" } 

class AdventureGame: 
    ''' controller for managiging frames ''' 
    def __init__(self, master): 
     self.master = master 
     self.frames = {} 
     for F in (StartGame,ShowCharacters,CharacterDetail): 
      frame = F(parent=master, controller=self) 
      self.frames[F.__name__] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 
     ''' rais the first frame ''' 
     self.raise_frame("StartGame") 

    def raise_frame(self,page_name): 
     ''' raise a frame ''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

    def lower_frame(self,page_name): 
     ''' lower a frame ''' 
     frame = self.frames[page_name] 
     frame.lower() 

class StartGame(tk.Frame): 
    ''' introduction screen of the game ''' 
    def __init__(self, parent, controller): 
    super(StartGame,self).__init__(parent) 
    self.controller = controller 
    ''' introduction text ''' 
    tk.Label(self, text="welcome to this game").grid() 
    tk.Button(self, text="next", command=lambda: controller.raise_frame("ShowCharacters")).grid() 

class ShowCharacters(tk.Frame): 
    ''' main frame, overview of all pokemon ''' 
    def __init__(self, parent, controller): 
    super(ShowCharacters,self).__init__(parent) 
    self.controller = controller 
    for row, character in enumerate(characters): 
     name_label = tk.Label(self, text=characters[character]) 
     name_label.grid(row=row,column=0) 
     info_button = tk.Button(self, text="view info", command=partial(self.switch,character)) 
     info_button.grid(row=row,column=1) 

    def switch(self, character): 
    test = self.controller.raise_frame("CharacterDetail") 

class CharacterDetail(tk.Frame): 
    ''' detail view of pokemon ''' 
    def __init__(self, parent, controller): 
     super(CharacterDetail,self).__init__(parent) 
     self.controller = controller 
     tk.Button(self, text="back", command=lambda: controller.lower_frame("CharacterDetail")).grid() 

    # somehow display characters name here 
    def showdetail(self): 
     tk.Label(self, text="test").grid() 

def main(): 
    root = tk.Tk() 
    app = AdventureGame(root) 
    root.mainloop() 
main() 

それはのように感じて、ここで説明したように、キーは、コントローラである:私は何かが欠けていますようにそれはちょうど感じ

How to get variable data from a class

は、誰かがアイデアを持っているん?あるいは、間違った方向で一緒に考えていますか?

私は、詳細を表示しようとした場合:

def switch(self, character): 
    test = self.controller.raise_frame("CharacterDetail") 
    CharacterDetail.showdetail(self) 

それはselfがShowCharacters

から selfあるフレーム、であるので、私は推測するCharacterDetailフレーム

いうしShowCharactersフレームで現れます

コントローラーで何かする必要がありますが、私の心は空になります。

コントローラにSS情報:

import tkinter as tk 
from functools import partial 

characters = {"character1": "abc", "character2": "def", "character3": "ghi", "character4": "jkl", "character5": "mnp", "character6": "qrs" } 

class AdventureGame: 
    ''' controller for managiging frames ''' 
    def __init__(self, master): 
     self.master = master 
     self.frames = {} 
     for F in (StartGame,ShowCharacters,CharacterDetail): 
      frame = F(parent=master, controller=self) 
      self.frames[F.__name__] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 
     self.app_data = {"test": "test"} 
     ''' rais the first frame ''' 
     self.raise_frame("StartGame") 

    def raise_frame(self,page_name): 
     ''' raise a frame ''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

    def lower_frame(self,page_name): 
     ''' lower a frame ''' 
     frame = self.frames[page_name] 
     frame.lower() 

class StartGame(tk.Frame): 
    ''' introduction screen of the game ''' 
    def __init__(self, parent, controller): 
    super(StartGame,self).__init__(parent) 
    self.controller = controller 
    ''' introduction text ''' 
    tk.Label(self, text="welcome to this game").grid() 
    tk.Button(self, text="next", command=lambda: controller.raise_frame("ShowCharacters")).grid() 

class ShowCharacters(tk.Frame): 
    ''' main frame, overview of all pokemon ''' 
    def __init__(self, parent, controller): 
    super(ShowCharacters,self).__init__(parent) 
    self.controller = controller 
    for row, character in enumerate(characters): 
     name_label = tk.Label(self, text=characters[character]) 
     name_label.grid(row=row,column=0) 
     info_button = tk.Button(self, text="view info", command=partial(self.switch,character)) 

     info_button.grid(row=row,column=1) 

    def switch(self, character): 
    test = self.controller.raise_frame("CharacterDetail") 
    CharacterDetail.example(self) 

class CharacterDetail(tk.Frame): 
    ''' detail view of pokemon ''' 
    def __init__(self, parent, controller): 
     super(CharacterDetail,self).__init__(parent) 
     self.controller = controller 
     tk.Button(self, text="back", command=lambda: controller.lower_frame("CharacterDetail")).grid() 
    def example(self): 
     tk.Label(self, text=self.controller.app_data["test"]).grid() 


def main(): 
    root = tk.Tk() 
    app = AdventureGame(root) 
    root.mainloop() 
main() 

ラベルは私が右のフレームにラベルを追加することができますので、私は右の自己へのアクセスを得ることができる方法、間違ったフレームに残っているのですか?

+0

何が質問ですか?あなたは試みましたが、その試みの結果は何ですか?それは働いていないのですか?あなたの予想とは違ったやり方は何ですか? –

+0

#何とか表示文字の名前はここに、このコメントをここに入れます。私は何とかCharacterDetailフレームが追加されたラベルを作成する必要があります。 – stetim94

+0

コメントを編集できません。それは悪いです。とにかく、私はCharacterDetailにメソッドを追加しようとしましたが、これは機能しませんでした。どのようにフレームにアクセスできるのか分かりません。 – stetim94

答えて

1

あなたはクラスShowCharactersの機能switch(...)CharacterDetail.example(self)を呼び出すと、selfは、クラスShowCharactersになります。したがって、クラスCharacterDetailの機能example(self)で作成されたラベルはShowCharactersフレームになります。

は試してみてください。クラスAdventureGameの機能raise_frame(...)

  • リターン上げフレーム:

    def switch(self, character): 
        frame = self.controller.raise_frame("CharacterDetail") 
        frame.example() 
    

def raise_frame(self, page_name): 
    frame = self.frames[page_name] 
    frame.tkraise() 
    return frame # return the raised frame 
  • は、クラスShowCharactersの機能switch(...)を変更します

  • +0

    恐ろしいです。良い説明が、理にかなっています!あなたのおかげで私は上に移動することができます、あなたは誰かの日を作った:) – stetim94

    関連する問題