ので、この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()
ラベルは私が右のフレームにラベルを追加することができますので、私は右の自己へのアクセスを得ることができる方法、間違ったフレームに残っているのですか?
何が質問ですか?あなたは試みましたが、その試みの結果は何ですか?それは働いていないのですか?あなたの予想とは違ったやり方は何ですか? –
#何とか表示文字の名前はここに、このコメントをここに入れます。私は何とかCharacterDetailフレームが追加されたラベルを作成する必要があります。 – stetim94
コメントを編集できません。それは悪いです。とにかく、私はCharacterDetailにメソッドを追加しようとしましたが、これは機能しませんでした。どのようにフレームにアクセスできるのか分かりません。 – stetim94