2016-12-18 64 views
0

所以這個計算器的問題:顯示另一幀的信息? (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() 

標籤仍然是錯誤的框架上,我怎樣才能獲得正確的自我,所以我可以將標籤添加到右邊框?

+0

這是什麼問題?你做了一個嘗試,那個嘗試的結果是什麼?它不工作?它有什麼不同於你的期望? –

+0

#以某種方式顯示字符名稱在這裏,我把這個評論在這裏。我不知何故需要創建一個添加CharacterDetail框架的標籤。 – stetim94

+0

我無法編輯評論,這是不好的。無論如何,我試圖給CharacterDetail添加一個方法,但這不起作用,我不明白我如何訪問框架 – stetim94

回答

1

正如你在ShowCharacters類的函數調用switch(...)CharacterDetail.example(self)selfShowCharacters類。因此,類CharacterDetail的功能example(self)中創建的標籤將位於ShowCharacters框架中。

嘗試:

  • 回報在AdventureGame類的功能raise_frame(...)募集框架:

    def raise_frame(self, page_name): 
        frame = self.frames[page_name] 
        frame.tkraise() 
        return frame # return the raised frame 
    
  • 修改ShowCharacters類的功能switch(...)

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

太棒了,非常感謝,正是我需要的。好的解釋,非常有道理!感謝你,我可以繼續前進,你讓別人的一天:) – stetim94