Objekte (Labels, Buttons, Bilder) auf Frames in Grid-Layout platzieren

Fragen zu Tkinter.
Antworten
smphe
User
Beiträge: 3
Registriert: Freitag 30. Dezember 2022, 18:10

Hallo Python-Community!

die ersten Geh-Versuche mit Python haben eigentlich ganz gut geklappt - nun scheitere ich aber an der GUI mit tkinter. Nach nun zwei Stunden Youtube-Videos, Internetsuche und Ausprobieren von Code-Schnipseln aus dem Netz, habe ich mir bei euch einen Account erstellt und erbitte Hilfe! :-)

Ich möchte eine kleine GUI im Format 1024x600 bauen. Das Fenster wird vier "Zonen" mit unterschiedlichen Hintergrundfarben haben, siehe Screenshot 1. Das klappt auch soweit. Sobald ich nun aber ein Objekt in einer der Zonen (Frames) platzieren möchte, zerhagelt es die Formatierung bzw. die ursprünglich definierten Frames lösen sich in Luft auf.

Habt ihr eine Idee, woran das liegen könnte?

Hier mein Code:

Code: Alles auswählen

import tkinter as tk

Fenster = tk.Tk()
Fenster.geometry('1024x600')
Fenster.resizable(False, False)

# Frames vorbereiten
TopLayer = tk.Frame(Fenster, bg='#000000', width=1024, height=50)
LeftLayer = tk.Frame(Fenster, bg='#D8D8D8', width=624, height=450)
RightLayer = tk.Frame(Fenster, bg='#EFF8FB', width=400, height=450)
BottomLayer = tk.Frame(Fenster, bg='#000000', width=1024, height=100)

# Frames anzeigen
TopLayer.grid(row=0, columnspan=2)
LeftLayer.grid(row=1, column=0)
RightLayer.grid(row=1, column=1)
BottomLayer.grid(row=2, columnspan=2)

# Überschrift auf TopLayer erstellen
TLHeadline = tk.Label(TopLayer, text="Meine Überschrift", font=("Arial", 12), fg="red")
TLHeadline.pack()

Fenster.mainloop()
Vor dem Einfügen der Überschriften sieht alles noch aus wie es soll:
Bild

Sobald die TLHeadline in den Code kommt passiert folgendes:
Bild

Danke euch vorab für Eure Hilfe!

Viele Grüße
Michael
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@smphe: Weder das Fenster selbst noch die Frames sollten irgendwelche Pixelgrössen vorgegeben bekommen. GUI-Elemente nehmen den Platz ein den sie tatsächlich *brauchen*.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
smphe
User
Beiträge: 3
Registriert: Freitag 30. Dezember 2022, 18:10

@__blackjack___: Danke für die Info, da hast du natürlich Recht. Ändert aber leider nichts an dem Sachverhalt, dass das Textlabel nicht "auf" dem Frame liegt, sondern das Frame mit schwarzem Hintergrund irgendwo hin verdrängt. Gerade ausprobiert ... :-(
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@smphe: Doch das liegt auf dem Frame. Und der ist dann genau so gross wie das Label, also die liegen perfekt übereinander, weswegen man den Frame dann natürlich auch nicht sieht. Der ist genau so gross, beziehungsweise klein, dass der Inhalt, also das Label da rein passt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
smphe
User
Beiträge: 3
Registriert: Freitag 30. Dezember 2022, 18:10

Sorry, aber auch das kann nicht stimmen - schau dir die beiden Screenshots an. Der Frame ist 50px hoch, sobald die Schrift dazu kommt ist er das nicht mehr und am unteren Fensterrand entsteht ein neuer Freiraum. Wie bekomme ich denn die Schrift auf den schwarzen Hintergrund?
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@smphe: Sorry, aber doch, das stimmt. Du hast in den oberen 2 Zellen des Grid einen Frame der genau so gross/klein ist wie das Label was Du da rein gesteckt hast. Der Frame behält ja nicht seine ursprüngliche Grösse, sondern passt sich dem Inhalt an. Darum macht das mit den absoluten Grössenangaben ja auch gar keinen Sinn. Unten wird der Platz dadurch natürlich grösser.

Lass den Fame weg wenn das Label das einzige ist was da angezeigt werden soll. Wenn der Hintergrund vom Label schwarz sein soll, dann musst Du das beim Label einstellen. Übrigens in *jedem* Fall, denn ”transparent”, so dass die Farbe von einem darunter liegenden Widget angezeigt wird, gibt es in Tk nicht! Und dann muss das Label mindestens den horizontalen Platz einnehmen. Wie man das macht hängt davon ab ob man `grid()` oder `pack()` nimmt, denn da legt man das fest. Bei `grid()` wäre es die ``sticky=tk.EW`` Option.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten