Python - Tkinter - Los widgets creados dentro de una clase heredada de Toplevel () aparecen en un marco diferente FUERA de la clase, la clase Toplevel () está vacía

Estoy intentando crear una clase y heredar deToplevel() de modo que los elementos GUI de la clase puedan estar contenidos dentro de una ventana separada. Normalmente solo heredaría deFrame() pero para mi propósito necesito que todo esté en una ventana. Estoy escribiendo el código en mi script de plantilla GUI solo para poder averiguar cómo hacerlo funcionar antes de pegarlo en el script real en el que quiero usarlo. Aquí está el código:

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

Ahora, por alguna razón, cuando hago clic en el botón "Organizar un juego", llama alHostGameDialog() funciona y crea elHostGameWindow(), PERO la ventana que se crea tiene el tamaño más pequeño posible y todos los elementos de la GUI que deben estar contenidos en laHostGameWindow() clase en lugar de aparecer en la principalApplication() cuadro. Y lo que es realmente extraño para mí es que no da ningún error, simplemente coloca todos los widgets dentro del marco principal de la aplicación en lugar deToplevel() que se crea

¿Qué diablos estoy haciendo mal? ¿Por qué no están los widgets colocados dentro de laToplevel()? He estado trabajando durante horas y nada tiene sentido. Por favor, si sabes algo que pueda ayudarme, házmelo saber.

Wow, nunca he tenido que esperar tanto tiempo para responder aquí antes, este debe ser un problema bastante ingenioso, todavía no sé qué hacer. Cualquier idea es muy apreciada!

Supongo que nadie sabe qué hacer con esto ... ¡Voy a seguir comprobando aquí!

Resuelto Resulta que no es una buena idea crear Y empaquetar un widget en la misma línea si creas una referencia a él. Crear y empaquetar un widget en la misma línea solo funciona si solo llama alWidget(args*).pack(args*) sin crear una referencia a ella.

Respuestas a la pregunta(1)

Su respuesta a la pregunta