Last active
May 25, 2017 18:20
-
-
Save xandaschofield/7a800fe6e99947a3985f4a4a9127b3a4 to your computer and use it in GitHub Desktop.
Quick application to allow someone to look through images and approve or disapprove them.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import argparse | |
import os | |
import sys | |
from PIL import Image, ImageTk | |
import tkinter as tk | |
class Application(tk.Frame): | |
def __init__(self, dir_name, extensions, write_file, master=None): | |
super().__init__(master) | |
self.pack() | |
self.extensions = extensions | |
self.write_file = write_file | |
self.master.bind('y', self.accepted) | |
self.master.bind('n', self.rejected) | |
self.master.bind('<BackSpace>', self.revisit) | |
self.render_images(dir_name) | |
def render_images(self, dir_name): | |
self.dir_name = dir_name | |
self.image_files = [ | |
img_name for img_name in os.listdir(dir_name) | |
if img_name.split('.')[-1] in self.extensions | |
] | |
if not self.image_files: | |
print('No valid images.') | |
sys.exit(1) | |
self.image_idx = 0 | |
self.problem_images = [] | |
self.img = ImageTk.PhotoImage(Image.open( | |
os.path.join(self.dir_name, self.image_files[self.image_idx]))) | |
self.image_panel = tk.Label(self, image=self.img) | |
self.image_panel.pack(side="bottom", fill="both", expand="yes") | |
def accepted(self, event): | |
self.progress() | |
def rejected(self, event): | |
self.problem_images.append(self.image_files[self.image_idx]) | |
print(self.image_files[self.image_idx]) | |
self.progress() | |
def revisit(self, event): | |
self.image_idx -= 1 | |
if self.problem_images and self.problem_images[-1] == self.image_files[self.image_idx]: | |
print('Undoing', self.problem_images[-1]) | |
self.problem_images = self.problem_images[:-1] | |
def progress(self): | |
self.image_idx += 1 | |
if self.image_idx < len(self.image_files): | |
self.img = ImageTk.PhotoImage(Image.open( | |
os.path.join(self.dir_name, self.image_files[self.image_idx]))) | |
self.image_panel.configure(image=self.img) | |
else: | |
if self.write_file is not None: | |
print('Writing to', self.write_file) | |
with open(self.write_file, 'w') as wf: | |
for filename in self.problem_images: | |
wf.write(filename + '\n') | |
self.master.quit() | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser( | |
description='Process image files') | |
parser.add_argument('--dir', type=str, help='directory to search for images', default='.') | |
parser.add_argument('--extensions', type=str, nargs='+', help='extensions to allow', default=['png']) | |
parser.add_argument('--write-file', type=str, help='optional file to write the list of rejected files') | |
args = parser.parse_args() | |
dirname = args.dir | |
extensions=args.extensions | |
write_file = args.write_file | |
print('Searching directory {} for extension(s) {}...'.format( | |
dirname, | |
', '.join(extensions))) | |
print('Tap y to approve, n to reject image. Backspace goes back/undoes an image rejection.') | |
root = tk.Tk() | |
app = Application(dirname, extensions=extensions, write_file=write_file, master=root) | |
app.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment