grid im grid

Fragen zu Tkinter.
Antworten
jody
User
Beiträge: 3
Registriert: Samstag 29. September 2012, 15:50

Hallo

Ich moechte gerne ein Widget, dessen Teilwidgets per Grid angeordnet sind,
selbst wiederum in das grid eines frames einbetten (im Beispiel 10 instanzen meines Namefield widgets untereinander).

Code: Alles auswählen

from Tkinter import *

class NameField(Frame):
    def __init__(self, master, sName, iNum, *args, **kw):
        Frame.__init__(self, master, *args, **kw)

        self.spamVar = StringVar()
        self.lblname = Label(self, text=sName)
        self.txtnum  = Entry(textvariable=self.spamVar)
        self.spamVar.set(str(iNum))
        self.lblname.grid(row=0,column=0)
        self.txtnum.grid(row=0,column=1)


root = Tk()

frame = Frame(root)

rows = 10
for i in range(1,rows):
    s="Entry "+str(i)
    nf=NameField(frame, s, i)
    nf.grid(row=i, column=0, sticky='news')

frame.update_idletasks()
root.mainloop()

Aber wenn ich das laufen lasse, sehe ich nur ein einzelnes Entry widget (mit Inhalt '9'),
d.h. das Entry des letzten NameField-Widgets.
Da scheint alles uebereinander gezeichnet worden zu sein. :?

Kann mir da jemand weiterhelfen?

Vielen Dank
Jody
BlackJack

@jody: Du musst dem `Entry` schon ein `master`-Argument geben, damit das auch weiss in welchem Elternwidget es angeordnet werden soll.
jody
User
Beiträge: 3
Registriert: Samstag 29. September 2012, 15:50

@BlackJack: Danke fuer den Hinweis.
die Zeile fuer die erzeugung eines Entry sieht jetzt so aus:

Code: Alles auswählen

        self.txtnum  = Entry(selfm, textvariable=self.spamVar)
Das Frame ist jetzt zwar so gross, dass 10 Entries untereinander Platz haetten,
aber die werden nicht dargestellt (grosses graues Fnester)

Irgendetwas ist da noch schief:wenn ich im Loop unten

Code: Alles auswählen

    nf=NameField(frame, s, i)
durch

Code: Alles auswählen

    nf=Label(frame, text=s)
ersetze (also normale Labels einfuege), sehe ich auch nichts (wieder nur ein graues Fenster)
Aendere ich diese Zeile aber zu

Code: Alles auswählen

    nf=Label(text=2)
, (also ohne Elternteil) dann werden die Labels angezeigt

Ich glaube, ich habe etwas grundsaetzliches hier nicht verstanden (es ist irgendwie anders als gtk, dass ich etwas besser kenne)

Danke
Jody
jody
User
Beiträge: 3
Registriert: Samstag 29. September 2012, 15:50

Nachtrag:
Wenn ich dem NameField root als parent gebe:

Code: Alles auswählen

    nf=NameField(root, s, i)
dann werden all meine NameFields sichtbar, sie sind aber nicht gridmaessig angeordnet (also die Entry Felder sind nicht genau uebereinander, sobald der Label Text laenger wird)...
BlackJack

@jody: Der `frame` auf Modulebene wird nicht „layouted”.

Zum Nachtrag: Natürlich sind die nicht ausgerichtet. Die Grids innerhalb der einzelnen `Frame`\s wissen ja nichts voneinander, die sind unabhängig. Wäre auch komisch wenn dem nicht so wäre.
Antworten