所以這個計算器的問題:顯示另一幀的信息? (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)
它在ShowCharacters幀顯示出來,而隨後CharacterDetail框架
我猜是因爲self
是框架,這是從ShowCharacters
self
我需要對控制器做些什麼,但我的想法只是空白
所以現在我pa 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