2016-12-09 1 views
0

Ich habe eine Toplevel-Klasse DesignWindow, die ein 10x10 Array von Tasten halten, wenn ich es auf die hier besprochene Weise anrufe: Tkinter; Toplevel in a new class es erstellt das Fenster innerhalb der letzten.Toplevel Inhalte im vorherigen Frame anzeigen

example

Was ich falsch gemacht habe? Der einzige Unterschied ist, dass mein "root" -Fenster (mit dem Menü) ein tk.Frame anstelle der tk.Tk in der zitierten Frage ist.

class MainWindow(tk.Frame): 
    """Draw the main window""" 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent, background='grey') 
     self.parent = parent 
     self.menuscreen = MenuScreen(self) 

     self.grid() 

     self.menuscreen.design.grid(column=0, row=0) 

class MenuScreen(tk.Frame): 
    """Create the menu screen""" 
    def __init__(self, parent): 
     self.design = tk.Button(command=self.create_design_window, text="Design") 

    def create_design_window(self): 
     self.design_window = DesignWindow(self) 

class DesignWindow(tk.Toplevel): 
    """Frame for design mode""" 
    def __init__(self, main): 
     tk.Toplevel.__init__(self) 

EDIT Erzeugung der Buttons:

 self.btn = [[0 for x in range(10)] for x in range(10)] 
     for column in range(10): 
      for row in range(10): 
       self.btn[column][row] = tk.Button(main) 
       self.btn[column][row].grid(column=column, row=row) 
+0

Bitte lesen Sie [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) –

+0

Muss 'MenuScreen .__ init__' nicht aufgerufen werden, ist es super und brauchen Sie nicht Übergeben der Eltern an beide Superkonstruktoren. –

+0

Tut mir wirklich leid, vergaß die Top-Klasse hinzuzufügen, die das Rendering-Bit tatsächlich tut:/ –

Antwort

1

Ich bin nicht sicher, in Ihrer Antwort genug Code gibt es für bestimmte wissen, aber es gibt auf jeden Fall zwei Fehler, die ich sofort sehen.

Zuerst ruft MenuScreen nicht die __init__ der Superklasse. Sie müssen dies MenuScreen.__init__ hinzuzufügen:

tk.Frame.__init__(self, parent) 

Zweitens, Sie sind nicht ein Elternteil zu den Widgets in MenuScreen geben, so dass sie in das Stammfenster hinzugefügt. Sie sollten einen Elternteil in der Gewohnheit, erhalten immer bereitstellt:

self.design = tk.Button(self, ...) 

Sie zeigen nicht, wie Sie Widgets in DesignWindow erstellen, aber ich vermute, Sie den gleichen Fehler machen. Sie müssen sicherstellen, dass alle Widgets eine explizite Eltern haben, oder sie werden im Stammfenster enden.

+0

Ich folge dies: https://Stackoverflow.com/questions/17466561/best-way-to-structure-a-tkinter-application als eine Möglichkeit zu strukturieren, so macht es Sinn, nicht richtig? –

+1

@ThomasCarroll: _ "so macht es Sinn, nicht" _ - macht Sinn nicht zu _was_? Sie müssen den Konstruktor der Superklasse aufrufen, und Sie müssen jedem Widget explizit ein Elternelement zuweisen. –

+0

Ich habe das Gefühl, dass ich ein grundlegendes Missverständnis darüber habe, was hier passiert? Ich habe Ihren Rat befolgt, aber es gibt ein Fenster ohne Schaltflächen, weil die Widgets nicht wie zuvor geladen sind. Ich werde versuchen, mein Programm neu zu strukturieren und zu sehen, ob es Änderungen vornimmt. –

Verwandte Themen