Einbinden einer Grafik in die GUI

Fragen zu Tkinter.
Antworten
Danny_Deluxe
User
Beiträge: 10
Registriert: Dienstag 27. Juli 2021, 08:49

Hallo zusammen

Ich bin leider noch ziemlicher Python-Anfänger und mit einem Problem konfrontiert, wo mir meine Google-Recherchen nicht weitergeholfen haben.

Ich versuche, bei der Erstellung einer GUI ein Bild als Logo einzufügen und er öffnet mir immer 2 Fenster. Ich habe Class gewählt, da ich diese als Vorlage für weitere Projekte nutzen möchte. Kann mir bitte jemand weiterhelfen?

Hier ein mein Code:

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk

def Bestände():
label_Inhalt = tk.Label(root, text="Hier steht der gesamte Inhalt",
font=("Arial", 48, "bold", "italic"),
background="#FDFAF1", width=38, height=10).place(x=300, y=250)

root = tk.Tk()
label_image = "Logo.jpg"
image = Image.open(label_image)
photo = ImageTk.PhotoImage(image)
label1 = ttk.Label(root, image=photo, compound="left").place(x=0, y=0)


class MainWindow(tk.Tk):

def __init__(self):
super().__init__()

w = self.winfo_screenwidth() # ermittelt die Breite des Bildschirms
h = self.winfo_screenheight() # ermittelt die Höhe des Bildschirms
self.geometry("%dx%d+0+0" % (w, h)) # legt die Grösse des Fensters fest
self.minsize(width=800, height=800) # legt die Mindestgrösse des Fensters fest
self.title("Startseite") #legt den Titel des Fensters fest
self.configure(background="#DEECD5") # legt die Hintergrundfarbe fest


# fügt die Labels für "Bestände" ein
label_Bestände = tk.Button(self, text="Bestände", width=25, height=3, command=Bestände).place(x=300, y=150)


root = MainWindow()

root.mainloop()

Herzlichen Dank im Voraus

Danny
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Von tk.Tk darf es nur eine Instanz geben, Du erzeugst aber zwei. Die eine Instanz `root` überschreibst Du dann später mit einer weiteren Instanz, die Du auch `root` nennst. Allein das wiederverwenden von Variablennamen ist schon schlecht.
Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, bei `Bestände` fehlt `root`. Wobei Du doch schon eine Klasse hast, es also gar keinen Grund gibt, eine separate Funktion zu haben.
Es macht wenig Sinn `None` an label_Inhalt oder label_Bestände auf solch komplizierte Art und Weise zu binden, zumal die Variablen nicht weiter verwendet werden. Einen Button `label_...` zu nennen, ist sehr verwirrende.
Auf oberster Ebene sollten nur Importe, Klasse- oder Funktionsdefinitionen stehen.

place sollte man nicht benutzen, sondern pack oder grid. geometry benutzt man auch nicht, sondern die Fenstergröße ergibt sich aus dessen Inhalt.
Alle GUI-Elemente sollten daher schon beim Initialisieren angelegt werden, und später nur noch deren Inhalt geändert werden.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk 

class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Startseite") #legt den Titel des Fensters fest
        self.configure(background="#DEECD5") # legt die Hintergrundfarbe fest
        image = Image.open("Logo.jpg")
        self.photo = ImageTk.PhotoImage(image)
        ttk.Label(self, image=photo, compound="left").pack()
        tk.Button(self, text="Bestände", width=25, height=3, command=self.setze_bestaende).pack()
        label_bestaende = tk.Label(self)
        label_bestaende.pack()

    def setze_bestaende(self):
        self.label_bestaende['text'] = "Hier steht der gesamte Inhalt"


def main():
    root = MainWindow()
    root.mainloop()

if __name__ == "__main__":
    main()
Danny_Deluxe
User
Beiträge: 10
Registriert: Dienstag 27. Juli 2021, 08:49

Herzlichen Dank Sirius3 für Deine Anmerkungen. Nach Deinen Anpassungen sieht der Code so aufgeräumt aus, wirklich klasse! Ich hab noch viel zu lernen. Liebe Grüsse Danny
Antworten