Seite 1 von 1

Bild Problem

Verfasst: Mittwoch 4. November 2020, 17:54
von rennmaus
Hallo zusammen,
Ich habe ein kleines Problem. Ich bin wirklich knapp davor mein kleines Programm zu beenden, aber ich bekomme es nicht gebacken, dass mir ein Bild angezeigt wird. tkinter habe ich ganz normal über 'import tkinter' importiert. root ist mein tkinter.Tk() und l steht für li.get("active"). Der Bildschrim passt sich zwar an, aber es wird mir kein Bild angezeigt. Das Bild ploppt bei mir hoch, aber es ist nur ein weißer Screen...

Code: Alles auswählen

Bild='C:/Users/chris/Desktop/Deepsky Datenbank/'
        Bild=Bild+l
        Bild=str(Bild)
        Bild=Bild.strip()
        fBild=Bild+'.png'
        print(fBild)
        canvas = Canvas(root, width=1000, height=600)
        canvas.pack()
        mein_Bild = PhotoImage(file=fBild)
        canvas.create_image(0, 0, image=mein_Bild)
Kann mir da jemand helfen? (Die Einrückung ist hier nicht zu beachten)

Mfg
Christian

Re: Bild Problem

Verfasst: Mittwoch 4. November 2020, 18:26
von rennmaus

Code: Alles auswählen

        Bild='C:/Users/chris/Desktop/Deepsky Datenbank/'
        Bild=Bild+l
        Bild=str(Bild)
        Bild=Bild.strip()
        fBild=Bild+'.Png'
        canvas = tkinter.Canvas(root)
        canvas.pack()
        mein_Bild = tkinter.PhotoImage(file=fBild)
        canvas.create_image(0, 0, anchor='central',image=mein_Bild)
So sieht er jetzt aus, anchor funktioniert, aber das Bild kommt leider immernoch nicht

Re: Bild Problem

Verfasst: Mittwoch 4. November 2020, 19:06
von Sirius3
Bitte zeige vollständig lauffähigen Code. Das was Du da mit `Bild` machst, ist ziemlich umständlich. Das erste `Bild` ist eigentlich ein Verzeichnis. `l` ist was auch immer, aber auf jeden Fall ein sehr schlechter Variablenname. Das ist dann aber schon ein String, so dass die nächste Zeile unnötig ist. Das strip sieht auch komisch aus. fBild sollte dann filename heißen und nicht ein kryptisches f.
Die Endung ist wohl .png und nicht .Png. Das mein_ bei mein_Bild ist unsinnig.

Re: Bild Problem

Verfasst: Mittwoch 4. November 2020, 19:12
von rennmaus

Code: Alles auswählen

import pathlib, tkinter, glob


def ende():
    root.destroy()

def anzeigen():
    l=li.get("active")
    Text='C:/Users/chris/Desktop/Deepsky Datenbank/Txt/'
    pfad=Text+l
    pfad=str(pfad)
    pfad=pfad.strip()
    file=open(pfad,'r')
    lb=tkinter.Label(root, text=file.read()).pack()
    file.close()
    try:
        Bild='C:/Users/chris/Desktop/Deepsky Datenbank/'
        Bild=Bild+l
        Bild=str(Bild)
        Bild=Bild.strip()
        fBild=Bild+'.Png'
        canvas = tkinter.Canvas(root)
        canvas.pack()
        mein_Bild = tkinter.PhotoImage(file=fBild)
        canvas.create_image(0, 0, anchor='central',image=mein_Bild)
    except:
        print("Leider kein Bild vorhanden")


root=tkinter.Tk()
lb=tkinter.Label(root)
button = tkinter.Button(root, text="Ende", command=ende)
button.pack()
scb=tkinter.Scrollbar(root, orient="vertical")
li=tkinter.Listbox(root, height=10, yscrollcommand=scb.set)
scb["command"] = li.yview
li.pack(side="left")
scb.pack(side="left", fill="y")
tkinter.Button(root, text="anzeigen", command=anzeigen).pack()
Textliste=glob.glob('C:/Users/chris/Desktop/Deepsky Datenbank/Txt/*')
for datei in Textliste:
    file = open(datei, 'r')
    li.insert("end",file.readline())


root.mainloop()
Sicherlich nicht perfekt, aber für meine Zwecke ausreichend

Re: Bild Problem

Verfasst: Mittwoch 4. November 2020, 19:57
von Sirius3
@rennmaus: ende braucht man nicht, weil man root.destroy auch direct als Callback angeben kann.
Alles was eine Funktion braucht, muß man als Argumente übergeben. Bei `anzeigen` fehlen li und root. lb wird an None gebunden, und auch gar nicht weiter benutzt.
Nackte excepts sollte man nicht verwenden, weil die auch viele Programmierfehler abfangen. Lap das einfach weg.

In einer Callback-Funktion sollte man keine neuen Elemente mehr anlegen, weil die werden ja bei jedem Knopfdruck immer mehr.
Variablennamen sollten sprechend sein. Ansonsten ist der Code unverständlich, das macht Dir das Programmieren nur unnötig schwer.
lb wird gar nicht benutzt. Warum benutzt Du glob, wenn Du doch pathlib importierst?
Textliste ist keine Liste von Texten sondern einfach nur Dateinamen.
datei ist keine Datei sondern ein Dateiname.
Dateien, die man öffnet sollte man auch wieder schließen. Am besten mit Hilfe des with-Statements.
Pfade sollten nicht mehrfach als Strings im Code vorkommen, sondern nur einmal als Konstante definiert werden.
Wie kommt es, dass die erste Zeile in den Dateien dem Dateinamen entspricht?

Zum eigentlichen Fehler: Du mußt eine Referenz auf das PhotoImage-Objekt merken. Für jede GUI sind Klassendefinitionen aus solchem Grund zwingend.

Ungetestet:

Code: Alles auswählen

import tkinter
from pathlib import Path

DATA_PATH = Path('C:/Users/chris/Desktop/Deepsky Datenbank')

class MainWindow(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        tkinter.Button(self, text="Ende", command=self.destroy).pack()
        scrollbar = tkinter.Scrollbar(self, orient="vertical")
        self.filename_listbox = tkinter.Listbox(self, height=10, yscrollcommand=scrollbar.set)
        scollbar["command"] = filename_listbox.yview
        self.filename_listbox.pack(side="left")
        scrollbar.pack(side="left", fill="y")
        tkinter.Button(self, text="anzeigen", command=self.anzeigen).pack()
        for pathname in DATA_PATH.glob('Txt/*'):
            with pathname.open() as lines:
                firstline = next(line).strip()
            self.filename_listbox.insert("end", firstline)        
        self.full_text = tkinter.Label(self)
        self.full_text.pack()
        self.canvas = tkinter.Canvas(self)
        self.canvas.pack()
        self.image = None

    def anzeigen(self):
        firstline = self.filename_listbox.get("active")
        path = DATA_PATH / 'Txt' / firstline
        self.full_text['text'] = path.read_text()
        path = DATA_PATH / firstline + '.png'
        self.image = tkinter.PhotoImage(file=str(path))
        self.canvas.create_image(0, 0, anchor='central', image=self.image)

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

if __name__ == '__main__';
    main()

Re: Bild Problem

Verfasst: Donnerstag 5. November 2020, 07:07
von rennmaus
Ich Beantworte einfach mal die Fragen.
1. Ich habe es davor mit Pathlib probiert, aber mit glob fand ich es irgendwie leichter.
2. 'Wie kommt es, dass deine erste Zeile dem Dateinamen entspricht?' In der Datei bekommt man ein paar Informationen über das Ausgewählte Objekt und da steht der Dateiname eben oben nochmal drin, das ist aber auch sehr praktisch, da ich davor versucht habe jeden Dateinamen zu lesen und in die Listbox einzufügen, aber das war dann immer ein Windows Patch, den ich dann, ganz aufwendig mit Slices kürzen musste....
3. Ich muss mit try arbeiten, da es nicht zwingend für jedes Objekt auch ein Bild gibt

Den Code probiere ich noch aus, sage dann wie er klappt. Aber danke schonmal im Voraus!
Mfg
Christian

Re: Bild Problem

Verfasst: Donnerstag 5. November 2020, 07:19
von rennmaus
Wie es aussieht, hat python/tkinter Probleme mit scrollbar und ich glaube ein paar selfs fehlen. In dem with Statement, muss es glaube ich lines und nicht line sein. Ich setze mich heute Nachmittag nochmal dran, vielleicht bekomme ich es ja gelöst

Re: Bild Problem

Verfasst: Freitag 6. November 2020, 07:15
von rennmaus
Ich bekomme es irgendwie nicht gelöst, da ich mich mit Klassen nicht so super auskenne

Re: Bild Problem

Verfasst: Freitag 6. November 2020, 08:32
von Sirius3
Neben den offensichtlichen Fehlern gab es nur noch ein paar komische Sachen, die schon in Deinem ersten Code drin waren:

Code: Alles auswählen

import tkinter
from pathlib import Path

DATA_PATH = Path('C:/Users/chris/Desktop/Deepsky Datenbank')

class MainWindow(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        tkinter.Button(self, text="Ende", command=self.destroy).pack()
        tkinter.Button(self, text="anzeigen", command=self.anzeigen).pack()
        scrollbar = tkinter.Scrollbar(self, orient="vertical")
        self.filename_listbox = tkinter.Listbox(self, height=10, yscrollcommand=scrollbar.set)
        scrollbar["command"] = self.filename_listbox.yview
        self.filename_listbox.pack(side="left", fill="y")
        scrollbar.pack(side="left", fill="y")
        for pathname in (DATA_PATH / 'Txt').iterdir():
            self.filename_listbox.insert("end", pathname.name)
        self.full_text = tkinter.Label(self)
        self.full_text.pack()
        self.canvas = tkinter.Canvas(self)
        self.canvas.pack()
        self.image = None

    def anzeigen(self):
        filename = self.filename_listbox.get("active")
        path = DATA_PATH / 'Txt' / filename
        self.full_text['text'] = path.read_text()
        path = (DATA_PATH / filename).with_suffix('.png')
        self.image = tkinter.PhotoImage(file=str(path))
        self.canvas.create_image(0, 0, anchor='nw', image=self.image)

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

if __name__ == '__main__':
    main()

Re: Bild Problem

Verfasst: Freitag 6. November 2020, 16:27
von rennmaus
Der funktioniert perfekt! Danke!