Skip to content

Instantly share code, notes, and snippets.

@xandaschofield
Last active May 25, 2017 18:20
Show Gist options
  • Save xandaschofield/7a800fe6e99947a3985f4a4a9127b3a4 to your computer and use it in GitHub Desktop.
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.
#!/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