pack() und grid()

Fragen zu Tkinter.
Antworten
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hallo,
wo finde ich Infos über dei Verwendung von pack() und grid()? Ich kann den Code unten laufen lassen, nur wenn ich "self.Group.pack()" gegen "self.Group.grid()" tausche funktioniert es nicht. Bisher hatte ich die Erfahrung gemacht, daß grid() und pack() nicht gemeinsam verwendet werden können. Was ist jetzt aber "gemeinsam". Hier muss ich pack() anscheinend wegen der "Dialog"-Klasse verwenden, doch checkbutton kann mit grid() arragiert werden ????

Edit: Übrigens wäre es mir lieber immer grid() verwenden zu können, um eine bessere Kontrolle über die Anordnung der Widgets zu haben.

Code: Alles auswählen

from Tkinter import *
import tkSimpleDialog

class ConfigDia(tkSimpleDialog.Dialog):
    def __init__(self, master):
        tkSimpleDialog.Dialog.__init__(self,master)
    
    def body(self, master):
        self.Group = LabelFrame(self, text = "Test", padx = 5, pady = 5)
        self.Group.grid()
        
        self.param = {'Key_1': '1', 
                      'Key_2': '0'}
        
        self.GroupDict = {'Key_1': 'One', 
                           'Key_2': 'Two'}    
        
        for i, (key, value) in enumerate(self.GroupDict.iteritems()):
            int_var = IntVar()
            int_var.set(int(self.param[key]))
            setattr(self.Group, key, int_var)
            checkbutton = Checkbutton(self.Group, text=value, variable=int_var)
            checkbutton.grid()

class Main(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.Init_widgets()   
    
    def Init_widgets(self):
        DevConfigBtn = Button(master = self,
                              text = 'Configure',
                              command = lambda: ConfigDia(self))
        DevConfigBtn.pack()
    

root = Tk()
main = Main(root)
main.grid()
root.mainloop() 

Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Immer noch auf effbot.org.

Aber kurze Erklärung, jedes Widget *darf* einen Geometry-Manager(Pack, Grid oder Place) nutzen. d.h. jedes Widget kann seinen eigenen haben, aber niemals zwei gleichzeitig. So kann man zum Beispiel eine Tabelle von Widgets nutzen in der aber jeweils "pack"-Methoden genutzt werden. Die Wahl des Geometry-Managers sollte also für jedes Widget vorher klar sein.

Ich habe früher fast nur mit dem Grid-Manager gearbeitet, dann hatte ich mit gtk angefangen und dort war im Tutorial so schön das arbeiten mit vertikalen und horizontalen Boxen erklärt, das ich es auch in Tk so gehandhabt habe und nun fast ausschließlich pack nutze. Von Place sollte man aber abraten, denn es reicht eine andere Schriftart bzw. Größe und deine Positionierung ist nutzlos.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@hypnoticum: pack() und grid() im Tkinterbook vom Effbot.

"Gemeinsam" heisst für Widgets, die im selben Container-Widget stecken, also den selben "master"/"parent" haben.

Die `body()`-Methode ist im Grunde auch falsch implementiert. Da wird ein `Frame` übergeben in den die Widgets für den "Körper" des Dialogs sollen. Dein `Group` muss also dieses Widget `master` als Elternwidget haben und nicht `self`. In dem `Frame` kannst Du dann einen Layoutmanager Deiner Wahl verwenden und bist nicht davon abhängig was die `Dialog`-Klasse "in sich selbst" für das Layout verwendet.

So wie es jetzt aussieht hätte ich für die `Checkbutton`\s auch `pack()` verwendet. Ein "Grid", welches nur aus einer Spalte oder einer Zeile besteht, benötigt ja kein Raster.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@BlackJack
Das mit dem "self" im body ist auf meinem Mist gewachsen, hatte ich hier im Code-Beispiel ausversehen noch self drin. Ich änder das gleich mal.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

@BlackJack:
Es kommen später noch weitere Spalten hinzu.

danke :)
Antworten