@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()