簡體   English   中英

在另一幀上顯示信息? (tkinter python)

[英]displaying information on another frame? (tkinter python)

所以有這個stackoverflow問題:

在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()

感覺就像鑰匙在控制器中一樣,如下所述:

如何從類中獲取變量數據

感覺就像我在想什么,有人有主意嗎? 還是我一起思考方向錯誤?

如果我嘗試顯示細節:

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

它顯示在ShowCharacters框架而不是CharacterDetail框架

我猜是因為self是框架,這是ShowCharacters的self

我需要對控制器做一些事情,但是我的腦袋一片空白

所以現在我將信息傳遞給控制器​​:

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()

標簽仍然在錯誤的框架上,我如何獲得正確的自我,以便可以將標簽添加到正確的框架?

當您在ShowCharacters類的函數switch(...)中調用CharacterDetail.example(self)時, self將是ShowCharacters類。 因此,在類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() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM