#!/usr/bin/env python from pprint import pprint from pathlib import Path import tkinter as tk import tkinter.filedialog from functools import partial from PIL import ImageTk,Image def pack(what, *args, **kwargs): '''replacement for tkinters object.pack() method, returning the object''' what.pack(*args, **kwargs) return what class MainWin(tk.Tk): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title('Mein Titel ;-)') self.menubar = tk.Menu(self) self.config(menu=self.menubar) self.filemenu = tk.Menu(self.menubar, tearoff=False) self.menubar.add_cascade(label='File', menu=self.filemenu) self.filemenu.add_command(label='Open', command=self.open) self.filemenu.add_command(label='Exit', command=self.destroy) self.navimenu = tk.Menu(self.menubar, tearoff=False) self.menubar.add_cascade(label='Navigation', menu=self.navimenu) self.navimenu.add_command(label='Next', command=partial(self.navi, True)) self.navimenu.add_command(label='Previous', command=partial(self.navi, False)) self.filename = pack(tk.Label(self, relief=tk.SUNKEN), side=tk.TOP, fill=tk.X) self.canvas = pack(tk.Canvas(self), side=tk.TOP, fill=tk.BOTH, expand=True) self.bind('n', lambda event: self.navi(True)) self.bind('', lambda event: self.navi(True)) self.bind('', lambda event: self.navi(False)) self.bind('p', lambda event: self.navi(False)) self.bind('o', lambda event: self.open()) self.bind('', self.on_resize) self.files = list() self.index = 0 self.image = None def on_resize(self, *args, **kwargs): self.display_file() def open(self, *args, **kwargs): directory = Path(tk.filedialog.askdirectory(master=self, title='Verzeichnis?', initialdir='/home/luke/Downloads')) self.files = sorted([f for f in directory.iterdir() if f.is_file() and (str(f).lower().endswith('.jpg') or str(f).lower().endswith('.jpeg') or str(f).lower().endswith('.png') or str(f).lower().endswith('.gif'))]) self.display_file() def navi(self, go_up, *args, **kwargs): if not self.files: tk.messagebox.showwarning(title='No images loaded', message='No images were loaded, please use File->Open first') return if go_up: if self.index < len(self.files): self.index += 1 else: if self.index > 0: self.index -=1 self.display_file() def display_file(self): self.canvas.update() width = self.canvas.winfo_width() height = self.canvas.winfo_height() filepath = self.files[self.index] pilimage = Image.open(filepath) pilimage.thumbnail((width, height), Image.ANTIALIAS) img = ImageTk.PhotoImage(image=pilimage) self.canvas.create_image(1, 1, anchor=tk.NW, image=img) self.canvas.image = img self.filename.config(text=str(filepath.name)) if __name__ == '__main__': MainWin().mainloop()