2016-12-18 3 views
0

so gibt es diese Frage Stackoverflow:Informationen zu einem anderen Frame anzeigen? (Tkinter Python)

Switch between two frames in tkinter

, die für den Aufbau einer Anwendung wie eine schöne Basis aussieht. Aber was ist, wenn ich auf startPage mehrere Schaltflächen haben und die entsprechenden Daten auf PageOne anzeigen möchte? Hier ist mein Versuch:

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

Es fühlt sich an wie die der Schlüssel ist in der Steuerung, wie hier erklärt:

How to get variable data from a class

Es fühlt sich an wie ich bin etwas fehlt, hat jemand eine Idee ? Oder denke ich zusammen in die falsche Richtung?

Wenn ich versuche, das Detail zu zeigen:

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

es zeigt eher am ShowCharacters Rahmen bis dann die CharacterDetail Rahmen

Ich denke, da self der Rahmen, die self von ShowCharacters ist

Ich muss etwas mit dem Controller tun, aber mein Geist geht einfach leer

So jetzt ich pa ss Informationen an die Steuerung:

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

das Etikett ist immer noch auf dem falschen Rahmen, wie kann ich den Zugang zum Recht selbst erhalten, so kann ich das Etikett an den richtigen Rahmen hinzufügen?

+0

Was ist die Frage? Du hast versucht, was ist das Ergebnis dieses Versuchs? Funktioniert es nicht? Was macht es anders als Sie erwarten? –

+0

# irgendwie Zeichen Namen hier anzeigen, ich setze diesen Kommentar hier. Ich muss irgendwie ein Etikett erstellen, das CharacterDetail-Rahmen hinzugefügt wird. – stetim94

+0

ich kann keine Kommentare bearbeiten, das ist schlecht. Wie auch immer, ich habe versucht, eine Methode zu CharacterDetail hinzufügen, aber das hat nicht funktioniert, ich verstehe nicht, wie ich auf den Rahmen zugreifen kann – stetim94

Antwort

1

Wie Sie CharacterDetail.example(self) in Funktion switch(...) der Klasse nennen ShowCharacters wird self seine Klasse ShowCharacters. Daher wird das in Funktion example(self) der Klasse CharacterDetail erstellte Etikett in ShowCharacters Rahmen sein.

Versuchen:

  • Rückkehr der erhöhten Rahmen in Funktion raise_frame(...) der Klasse AdventureGame:

    def raise_frame(self, page_name): 
        frame = self.frames[page_name] 
        frame.tkraise() 
        return frame # return the raised frame 
    
  • Funktion ändern switch(...) der Klasse ShowCharacters:

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

Ehrfürchtig, vielen Dank, genau das, was ich brauchte. Gute Erklärung, macht Sinn! Dank dir kann ich weitermachen, du hast jemanden Tag gemacht :) – stetim94

Verwandte Themen