Mit Label ein in einem Frame Bilder anzeigen, aber immer nur eins

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bigbonzo
User
Beiträge: 21
Registriert: Samstag 30. November 2019, 10:23

Hallo, ich bin da an einem ganz einfachen Foto-Browser dran. Ich zeige alle Fotos eines Verzeichnisses in einer Listbox an. Klickt man einen Fotoverweis in der Liste an, wird das Foto in einem anderen Frame unterhalb der Listbox angezeigt. Das funktioniert auch alles gut, das Problem ist nur, dass anscheinend bei weiteren Selektionen die Fotos in dem Frane dazugepackt werden und der Frame "läuft über".

Wie bringe ich Python dazu mit foto_label=Label(bottomFrame,anchor=N, image=photo) in dem bottomFrame immer nur ein Foto anzuzeigen, also quasi den Frame immer zu überschreiben ?

Hat jemand eine Idee ?

Vielen Dank.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du erstellst immer wieder neue Labels. Statt dessen erzeugt man nur einmal ein Label und ändert nur das Bild.
bigbonzo
User
Beiträge: 21
Registriert: Samstag 30. November 2019, 10:23

...danke, genau, so soll es laufen ;-) - Mit welcher Anweisung ändert man denn ein Bild eines bestehenden Labels.

Ok, der AusgabeFrame "fotofr" wird nur einmal erstellt (hoffe ich); das Label dann mehrfach ? ich dachte, mit dem Foto_label.update() hätte ich immer das gleiche.

class fotoframe():
def __init__(self):
self.bottomFrame=Frame(root, bg="red")
self.bottomFrame.pack(side=BOTTOM,fill=X)

………..
fotofr=fotoframe()
### Foto Ausgabe
foto_label=Label(fotofr.bottomFrame,anchor=N, image=photo)
Label.image=photo
foto_label.config=Label(image=photo)
foto_label.update()
foto_label.pack(fill=BOTH, expand=0)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das binden von photo an die KLASSE Label ist ein heftiger Fehler. Das muss an foto_label gebunden werden.

Und was du da mit config machst ist grober Unfug. Das muss AUFGERUFEN werden.

foto_label.configure(image=photo)

So wie das da steht erzeugt es permanent neue Label Objekte.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bigbonzo: Der Name `fotofr` ist ja fast schon witzig. Versuch mal den Quelltext laut vorzulesen ohne an der Stelle zu lachen. Spass beiseite: Das ist kein guter Name. Verwende keine kryptischen Abkürzungen. Wenn Du `foto_frame` meinst, dann schreib das auch.

Klassennamen werden in Python ”MixedCase” geschrieben, also ``class FotoFrame:``. Konstanten KOMPLETT_GROSS, und alles andere klein_mit_unterstrichen. Also `bottom_frame` statt `bottomFrame`.

Von ausserhalb der Klasse in den Frame in der Klasse ein Label zu platzieren riecht komisch. Das wäre ein Job für eine Methode *in* der Klasse. Und im Grunde wahrscheinlich einfach die `__init__()`-Methode die da ein leeres Label anlegt, und die Klasse würde dann eine Methode zur Verfügung stellen, die in dem Label dann ein Bild setzt.

Die `update()`-Methode auf Widgets solltest Du nicht aufrufen. Änderungen anzuzeigen ist der Job der GUI-Hauptschleife. Da sollte man nicht selbst drin herum pfuschen oder versuchen die selbst nachzuprogrammieren.

Der Ausschnitt lässt vermuten das da ein Sternchen-Import aus `tkinter` gemacht wurde — *-Importe sind Böse™. Da holt man sich unkontrolliert Namen ins Modul. Bei `tkinter` sogar *sehr viele* Namen, von denen nur ein ganz kleiner Bruchteil tatsächlich verwendet wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
bigbonzo
User
Beiträge: 21
Registriert: Samstag 30. November 2019, 10:23

… danke deets.
Habe den Code angepasst. Ich glaube der Label Fehler ist jetzt raus ??
Das Programm schreibt jetzt trotz neuer Selektion das Bild erneut in den Frame, also noch keine Aktualisierung. Hast du noch einen Hinweis ??

### Foto Ausgabe
foto_label=Label(fotofr.bottomFrame,anchor=N, image=photo)
foto_label.image=photo
foto_label.configure(image=photo)
foto_label.pack(fill=BOTH, expand=0)
bigbonzo
User
Beiträge: 21
Registriert: Samstag 30. November 2019, 10:23

... danke Blackjack. Bin nur Gelegenheitsprogrammierer und kannte die Vereinbarungen nicht.
In der Tat nutze ich "from tkinter import *", wie kann ich das denn konkretisieren, um die Widgets reinzukriegen ??
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bigbonzo: Üblich ist ``import tkinter as tk`` und dann über den Namen `tk` auf den Modulinhalt zugreifen, also `tk.Label(…)`, `tk.Frame(…)` und so weiter.

Der gezeigte Code *erstellt* ja ein Label. Wenn das die Stelle ist wo ein anderes Bild angezeigt werden soll, dann ist das immer noch das gleiche Problem: Du erstellst ein Label statt das (hoffentlich) vorhandene einfach nur umzukonfigurieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten