tkinter bild laden in label ...

Fragen zu Tkinter.
Antworten
AngryPython
User
Beiträge: 1
Registriert: Montag 13. Oktober 2014, 13:14

Hallo,

ich hoffe ihr könnte mit mir weiter helfen. Kurze Info habe nicht gesamten code gepostet.
Habe mit hilfe von Python Bücher angefangen etwas kleines zu Programmieren.
Leider hänge ich an einen Problem fest wo ich auch mit hilfe von Internet auf keine Lösung kam.
Mit mein Programm will ich Bilder anzeigen. MenuBar etc.. und Pfad zum Ordner der Bilder funktioniert auch.

Mein Problem:
Ich kann ein Bild nicht in Label1 laden, damit ich Später mit Button das nächste Bild laden kann oder löschen usw...
Mein Code in Zeile 13,14,15 ist Möglicherweise falsch.

Code: Alles auswählen

class Application(Frame):
    def __init__(self, parent=None):
        print ("Start")
        Frame.__init__(self, parent)
        self.pack(expand=YES, fill=BOTH)
        self.master.title("Application")
        self.createWidgets()
        self.zahl = 0

    def createWidgets(self):
        self.makeMenuBar()
        self.makeToolBar()
        self.Label1 = Label(self, image=var)
        self.Label1.config(relief=SUNKEN, width=100, height=50)
        self.Label1.pack(expand=YES, fill=BOTH)
        ...
        ...
        ...
    def bildload(self):
        print ("nächstes Bild") # ab hier
        ...
Das einzige was funktioniert aber nicht fehlerfrei ist,- ist dieser Code:

Code: Alles auswählen

        imgobj = PhotoImage(file=bild_eingabe)
        Label(self, image=imgobj).pack() 
        Label.image = imgobj 
Aber jedes mal wenn das nächste Bild geladen wird, dann wird mein Programm immer größer und das nächste Bild verschiebt sich nach unten.
Bitte habt Verständnis(wenn mein Code nicht perfekt sein sollte) habe versucht etwas aus Bücher und Internet zusammen zu proggen um mein Programm zum laufen zu bekommen.

Ich hoffe jemand kann mir weiter helfen.
MFG und danke im voraus.
BlackJack

@AngryPython: Du darfst für die neuen Bilder nicht neue `Label`-Widgets erstellen sondern musst das wo bereits ein Bild angezeigt wird verändern, so dass dort das neue Bild angezeigt wird. Dafür kann man einzelnen Optionen eines Widgets per Schlüsselzugriff neue Werte geben (``widget['option_name'] = new_value``) oder die `configure()`-Methode verwenden (``widget.configure(option_name=new_value)``). Bei Bildern musst Du darauf achten dass das Bild irgendwo auf Python-Seite referenziert wird, damit es nicht aus dem Speicher gelöscht wird. Also zum Beispiel als Attribut auf dem `Label`-Exemplar. Und nicht wie in Deinem Dreizeiler als Attribut auf der `Label`-*Klasse*.

Sonstige Anmerkungen: Die Namensgebung ist problematisch. Einmal hält sich die Schreibweise nicht an den Style Guide for Python Code. Und dann sind so generische Namen wie `label` oder `zahl` schlecht. Namen sollen dem Leser vermitteln was der Wert bedeutet. Zu wissen das es sich bei einem Attribut um eine Zahl handelt ist zwar ganz nett, verrät aber überhaupt nichts darüber wofür dieses Attribut verwendet wird. Ferner ist das nummerieren von Namen ein Warnzeichen dass man entweder bessere Namen finden sollte, oder eigentlich keine einzelnen Namen sondern eine Datenstruktur für die Werte verwenden möchte.

Sternchen-Importe sollte man vermeiden. Damit holt man sich gerade bei umfangreichen Modulen alle möglichen Namen in den aktuellen Namensraum von denen man nur einen kleinen Bruchteil verwendet. Bei Tkinter sind das mal eben ca. 190 Namen. Man kann schlechter sehen woher Namen eigentlich kommen. Und es besteht die Gefahr von Namenskollisionen. Tkinter wird üblicherweise unter dem Namen `tk` importiert: ``import Tkinter as tk``.

Widgets layouten sich nicht selbst. Damit nimmt man demjenigen der das Widget einbindet die Möglichkeit selber zu entscheiden wie es eingebunden wird.
Antworten