Automatisches Vergrößern von Widgets mit grid()

Fragen zu Tkinter.
Antworten
paddg 42
User
Beiträge: 9
Registriert: Montag 23. November 2009, 17:27

Hallo,

ich habe ein Problem mit dem Grid-Manager.
In meinem Beispielprogramm (soll nur das Problem verdeutlichen) will ich ein Text-Widget so einrichten, dass es sich automatisch mit dem Fenster vergrößert.
Ich habe dazu Methoden benutzt, die ich in einigen Tutorials gelesen habe. Leider funktioniert mein momentaner Code noch nicht.

Code: Alles auswählen

import Tkinter

class Textfenster(Tkinter.Frame):
    def __init__(self, master):
        Tkinter.Frame.__init__(self, master)
        self.grid()
        self.set_widget()
    def set_widget(self):
        self.text = Tkinter.Text(self)
        self.text.grid(row=0, column=0, sticky="wens")
        self.rowconfigure(0, weight=2, minsize=200)
        self.columnconfigure(0, weight=2, minsize=200)

t = Textfenster(Tkinter.Tk())
t.mainloop()
Für eure Hilfe wäre ich sehr dankbar.
BlackJack

@paddg 42: Widgets sollten sich nicht selbst "layouten". Das macht sie unflexibel. Wenn Du das ``self.grid()`` aus der `__init__()` heraus nimmst und statt dessen nach dem erstellen ein ``t.pack(fill=Tkinter.BOTH, expand=True)`` einfügst, sollte es gehen.
paddg 42
User
Beiträge: 9
Registriert: Montag 23. November 2009, 17:27

In meinem Beispielprogramm funktioniert es wunderbar.
In meinem eigentlichen Programm gibt es aber über dem Text-Widget noch Labels bzw. Buttons.

In folgendem Programm vergrößert sich das Text-Widget zwar wie gewünscht, allerdings werden die Labels so verschoben, dass das Label1 mehr "Freiraum" bekommt als die anderen.

Code: Alles auswählen

import Tkinter

class Textfenster(Tkinter.Frame):
    def __init__(self,master):
        Tkinter.Frame.__init__(self,master)
        self.set_widgets()
    def set_widgets(self):
        self.label1=Tkinter.Label(self,text="Label1")
        self.label1.grid(row=0,column=0)
        self.label2=Tkinter.Label(self,text="Label2")
        self.label2.grid(row=0,column=1)
        self.label3=Tkinter.Label(self,text="Label3")
        self.label3.grid(row=0,column=2)
        self.label4=Tkinter.Label(self,text="Label4")
        self.label4.grid(row=0,column=3)
        self.text=Tkinter.Text(self)
        self.text.grid(row=1,column=0,columnspan=4,sticky="wens")
        self.rowconfigure(0,weight=2,minsize=200)
        self.columnconfigure(0,weight=2,minsize=200)

t=Textfenster(Tkinter.Tk())
t.pack(expand=True,fill="both")
t.mainloop()
Wenn man die Zeile "self.columnconfigure(0,weight=2,minsize=200)" weglässt, sind die Buttons zwar gleichmäßig verteilt, aber das Text-Widget kann nur nach unten vergrößert werden.

Für einen Lösungsvorschlag, bei dem sich das Text-Widget in beide Richtungen vergrößert und die Labels oben gleichmäßig verteilt werden, wäre ich sehr dankbar.
BlackJack

@paddg 42: Du musst ein `weight` für alle Zeilen und Spalten im Grid setzen, die vertikal oder horizontal ihre Grösse ändern sollen. Du willst ja nicht nur dass sich vertikal die grösse von dem `Text`-Widget ändert, sondern auch die `Label` darüber sollen sich gleichmässig vergrössern. Also musst Du bei Zeile 1 ein Gewicht setzen und bei den Spalten 0 bis 3 auch. Ich würde da auch Gewicht 1 statt 2 nehmen, denn wenn überall 2 steht, läuft es ja doch wieder auf 1 hinaus.
paddg 42
User
Beiträge: 9
Registriert: Montag 23. November 2009, 17:27

Das klappt so weit.
Danke für die Hilfe.
Antworten