Python Tkinter: Label in Frame?
Ich habe ein Frame wie folgt:
import tkinter
root = tkinter.Tk()
root.geometry('100x100')
frame = tkinter.Frame(root, width=100, height=80, bg='green')
frame.pack()
root.mainloop()
Ausgabe ist ein Fenster, das größtenteils grün ist. Jetzt möchte ich in dieser grünen Fläche ein Label haben. Dazu ergänze ich zwischen frame.pack() und root.mainloop() folgende Zeilen:
label = tkinter.Label(frame, text='TESTTESTTEST')
label.pack()
Ausgabe ist ein Fenster mit TESTTESTTEST. Grün ist jetzt aber gar nichts mehr. Warum ist denn mein Frame verschwunden? Der Text ist auch nicht annähernd groß genug, dass dessen Background die Fläche vollständig verdecken könnte.
Was mache ich falsch? Warum geht das nicht?
Ich habe zwischen frame und label testweise ein zweites Frame eingebaut:
frame2 = tkinter.Frame(frame, width=100, height=20)
frame2.pack()
Die Fläche von frame2 ist dann nicht eingefärbt. Dafür ist es dann links und rechts von meinem label grün. Darunter aber nicht.Wie kann das denn funktionieren?
1 Antwort
Die pack-Funktion sorgt dafür, dass dein Widget automatisch verkleinert wird (auf die Fläche, die es wirklich benötigt - dabei nehmen die Kindelemente mit Einfluss auf die Größe; = geometry propagation). Dem kannst du mit pack_propagate entgegenwirken:
# ...
frame = tkinter.Frame(root, width=100, height=80, bg='green')
frame.pack_propagate(0)
frame.pack()
label = tkinter.Label(frame, text='TESTTESTTEST')
label.pack()
# ...
Beachte, dass es bei Einsatz dieser Funktion notwendig ist, Höhe und Breite explizit anzugeben, andernfalls ist der Frame gar nicht mehr sichtbar.
Eine transparente Label-Fläche kannst du übrigens ebenso nicht kreieren. Entweder du setzt die Hintergrundfarbe ebenso auf grün oder du verwendest stattdessen eine Canvas-Komponente, auf der du Text zeichnest.