Rahmen mal dargestellt, mal nicht dargestellt

Fragen zu Tkinter.
Antworten
fatrat
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2008, 11:03

Hallo,
schönes Forum hier! Ein Gruß an alle, ist mein erster Beitrag :-)

hat jemand eine Idee, wie folgendes zustande kommt:

ich erzeuge einen Rahmen und ein Label, das in dem Rahmen dargestellt werden soll. Fall 1: Widgets werden gleich gepackt --> Rahmen wird nicht dargestellt. Fall 2: Widgets werden nach der Instanzierung gepackt --> Rahmen wird dargestellt. Hat evtl. jemand eine Erklärung für das Phänomen?

Code: Alles auswählen

# Rahmen1.py
from Tkinter import *

class Rahmen1:
    def __init__(self):

        # Widgets instanzieren
        self.fenster = Tk()

        self.rahmen = Frame(master=self.fenster,relief=RIDGE,bd=5).pack()
        self.andereslabel = Label(self.rahmen,text="test").pack()

##        self.rahmen = Frame(master=self.fenster,relief=RIDGE,bd=5)
##        self.andereslabel = Label(self.rahmen,text="test")

##        self.layout()
        self.fenster.mainloop()

##    def layout(self):
##        self.rahmen.pack()
##        self.andereslabel.pack()


r = Rahmen1()

Code: Alles auswählen

# Rahmen2.py
from Tkinter import *

class Rahmen2:
    def __init__(self):

        # Widgets instanzieren
        self.fenster = Tk()

        self.rahmen = Frame(master=self.fenster,relief=RIDGE,bd=5)
        self.andereslabel = Label(self.rahmen,text="test")

        self.layout()
        self.fenster.mainloop()

    def layout(self):
        self.rahmen.pack()
        self.andereslabel.pack()


r = Rahmen2()
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo fatrat !

Code: Alles auswählen

self.rahmen = Frame(master=self.fenster,relief="ridge",bd=5)
self.rahmen.pack()
self.andereslabel = Label(self.rahmen,text="test")
self.andereslabel.pack()
so geht's !

gruss frank
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

fatrat hat geschrieben: hat jemand eine Idee, wie folgendes zustande kommt:

ich erzeuge einen Rahmen und ein Label, das in dem Rahmen dargestellt werden soll. Fall 1: Widgets werden gleich gepackt --> Rahmen wird nicht dargestellt. Fall 2: Widgets werden nach der Instanzierung gepackt --> Rahmen wird dargestellt. Hat evtl. jemand eine Erklärung für das Phänomen?
Wie es geht, wurde ja schon gepostet. Hier die Erklärung des "Phänomens":
Es hat überhaupt nichts damit zu tun, ob das Erzeugen/Anzeigen der Widgetes in der __init__()-Methode oder sonstwo erfolgt, sondern liegt daran, dass du durch das Erzeugen z.B. des Labels eine Label-Instanz erwartest, die du aber nicht bekommst, wenn du direkt die pack()-Methode der Label-Instanz mit aufrufst. Dann bekommst du eben keine Label-Instanz, sondern den Rückgabewert der pack()-Methode (ich vermute None).

Konkret: Wenn du in Zeile 11 bei der Instanzbildung des Labels self.rahmen als master mitgibst, dann ist es nicht - wie du es gerne hättest - die Instanz des zuvor erzeugten Frames, sondern der Rückgabewert von pack(), den du als master mitgibst.
fatrat
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2008, 11:03

vielen dank euch beiden. @numerix, ich denke, ich hab so halbwegs verstanden, wieso. ich brauche erst ein Rahmenobjekt (eine Instanz). wenn ich gleich den Packer aufrufe, dann habe ich eben keine Instanz - und das nachfolgende Widget, das den Rahmen gern als master hätte, bekommt ihn nicht, da das Rahmenobjekt ja keines ist sondern "None", wie du vermutest... nur komisch, dass Python da keine Fehlermeldung ausgibt.

Schönen Gruß!
fatrat
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

fatrat hat geschrieben:vielen dank euch beiden. @numerix, ich denke, ich hab so halbwegs verstanden, wieso. ich brauche erst ein Rahmenobjekt (eine Instanz). wenn ich gleich den Packer aufrufe, dann habe ich eben keine Instanz - und das nachfolgende Widget, das den Rahmen gern als master hätte, bekommt ihn nicht, da das Rahmenobjekt ja keines ist sondern "None", wie du vermutest... nur komisch, dass Python da keine Fehlermeldung ausgibt.
Nicht ganz. Eine Instanz des Frames hast du schon; die brauchst du ja auch, um überhaupt die pack()-Methode aufrufen zu können. Aber du bindest keinen Namen an das Frame-Objekt und hast somit keine Möglichkeit, darauf noch einmal zugreifen zu können.

Du bindest den Namen an den Rückgabewert der pack()-Methode und der ist nicht zu gebrauchen.
Antworten