Python-Tkinter-Widgets, die in einer von Toplevel () geerbten Klasse erstellt wurden, werden AUSSERhalb der Klasse in einem anderen Frame angezeigt. Die Klasse Toplevel () ist leer

Ich versuche, eine Klasse zu erstellen und von zu erbenToplevel() Damit können die GUI-Elemente der Klasse in einem separaten Fenster enthalten sein. Normalerweise würde ich nur von erbenFrame() aber für meinen zweck brauche ich alles, um in einem fenster zu sein. Ich schreibe den Code in mein GUI-Vorlagenskript, damit ich herausfinden kann, wie er funktioniert, bevor ich ihn in das eigentliche Skript stecke, in dem ich ihn verwenden möchte. Hier ist der Code:

from Tkinter import *
import socket

myplayername = ''

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        class InfoLabel(Frame):
            def __init__(self, name, value, bgc, nfgc, vfgc, master=None):
                Frame.__init__(self, master)
                self.pack()
                Label(master=self, text=name, bg=bgc, fg=nfgc).pack({"side": "left"})
                Label(master=self, text=value, bg=bgc, fg=vfgc).pack({"side": "left"})

        class LabelEntry(Frame):
            def __init__(self, name, variable, bgc, fgc, entrysize, master=None):
                Frame.__init__(self, master)
                self.pack()
                Label(master=self, text=name, bg=bgc, fg=fgc).pack({"side": "left"})
                Entry(master=self, textvariable=variable, bg=bgc).pack({"side": "left"})

        class HostGameWindow(Toplevel):
            def __init__(self):
                global myplayername
                Toplevel.__init__(self)
                self.title('Host a Game')
                hostname = socket.gethostname()
                hostipaddr = socket.gethostbyname(hostname)
                hostport = 11489
                players = 0

                portsv = StringVar(value=str(hostport))
                numofplayers = StringVar(value=str(players))
                myname = StringVar(value=myplayername)

                hostgameframe = Frame(master=self, bg='#999', bd=3, relief=RIDGE, padx=5, pady=5).pack({"side": "left"})
                hoststatusframe = Frame(master=self, bg='white', bd=3, relief=RIDGE).pack({"side": "left"})
                hostbuttonframe = Frame(master=hostgameframe, bd=2, relief=RAISED, padx=5, pady=5).pack({"side": "bottom"})
                InfoLabel(master=hostgameframe, name='Hostname:', value=hostname, bgc='#999', nfgc='blue', vfgc='red').pack({"side": "top"})
                InfoLabel(master=hostgameframe, name='IP Address:', value=hostipaddr, bgc='#999', nfgc='blue', vfgc='red').pack({"side": "top"})
                LabelEntry(master=hostgameframe, name='Host on port:', variable=portsv, bgc='#999', fgc='blue', entrysize=len(str(hostport))).pack({"side": "top"})
                LabelEntry(master=hostgameframe, name='Players Joining:', variable=numofplayers, bgc='#999', fgc='blue', entrysize=2).pack({"side": "top"})
                LabelEntry(master=hostgameframe, name='Player Name:', variable=myname, bgc='#999', fgc='blue', entrysize=16).pack({"side": "top"})
                Button(master=hostbuttonframe, text='Host Game', width=10).pack({"side": "left"})
                Button(master=hostbuttonframe, text='Start Game', width=10).pack({"side": "left"})

            def close():
                self.destroy()

        def HostGameDialog():
            HostGameWindow()

        Button(master=self, text='Host a Game', command=HostGameDialog).pack()




root = Tk()
app = Application(master=root)
#root.wm_iconbitmap(default='INSERT ICON HERE')
#root.wm_title("TITLE OF PROGRAM")
#app.master.maxsize(640, 480)
app.master.minsize(640, 480)
app.master.resizable(0, 0)
app.mainloop()
app.quit()

Wenn ich nun aus irgendeinem Grund auf die Schaltfläche "Host a Game" klicke, wird die Schaltfläche "Host a Game" aufgerufenHostGameDialog() Funktion und es schafft dieHostGameWindow(), ABER das Fenster, das erstellt wird, ist so klein wie möglich und alle GUI-Elemente, die in dem Fenster enthalten sein solltenHostGameWindow() Klasse erscheinen stattdessen in der HauptApplication() Rahmen. Und das wirklich Seltsame an mir ist, dass es keine Fehler gibt, sondern nur alle Widgets innerhalb des Hauptanwendungsrahmens statt desToplevel() das wird erstellt.

Was zum Teufel mache ich falsch? Warum sind die Widgets nicht in derToplevel()? Ich bin jetzt schon seit Stunden dabei und nichts ergibt einen Sinn. Bitte, wenn Sie etwas wissen, das mir helfen könnte, lassen Sie es mich wissen.

Wow, ich musste hier noch nie so lange auf eine Antwort warten, das muss ein ziemlich raffiniertes Problem sein, ich weiß immer noch nicht, was ich tun soll. Irgendwelche Ideen werden sehr geschätzt!

Ich vermute, niemand weiß, was er damit anfangen soll ... ich werde es hier aber weiter überprüfen!

Gelöst! Es ist keine gute Idee, ein Widget in derselben Zeile zu erstellen UND zu packen, wenn Sie einen Verweis darauf erstellen. Das Erstellen und Packen eines Widgets in derselben Zeile funktioniert nur, wenn Sie die aufrufenWidget(args*).pack(args*) ohne einen Verweis darauf zu erstellen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage