Skip to content

Instantly share code, notes, and snippets.

@pantor
Created December 11, 2017 23:08
Show Gist options
  • Save pantor/5ba3e1e4436e9b5c07bf507e2cd9cb45 to your computer and use it in GitHub Desktop.
Save pantor/5ba3e1e4436e9b5c07bf507e2cd9cb45 to your computer and use it in GitHub Desktop.
Image Viewer
#!/usr/bin/python3
import numpy as np
import pandas as pd
import tkinter as tk
from PIL import Image, ImageTk
class Viewer:
grid = (3, 2)
def __init__(self, directory, filename, filename_output=None):
self.directory = directory
self.filename = filename
self.filename_output = filename_output if filename_output else filename
self.raw_data = pd.read_csv(directory + filename, index_col='id')
self.data = self.raw_data
self.index = 0
self.index_diff = self.grid[0] * self.grid[1]
self.selected = None
def filter(self, query):
self.data = self.raw_data.query(query)
def show(self):
self.root = tk.Tk()
self.image_frame = tk.Frame(self.root)
self.image_frame.pack(side='left')
self.info_frame = tk.Frame(self.root)
self.info_frame.pack(side='right')
self.info = tk.Label(self.info_frame)
self.info.pack(side='top', fill='both')
self.remove_button = tk.Button(self.info, text='Remove', command=self.remove)
self.remove_button.pack(side='top')
self.remove_button = tk.Button(self.info, text='Save', command=self.save)
self.remove_button.pack(side='top')
self.page_info = tk.Frame(self.info_frame)
self.page_info.pack(side='bottom', fill='x')
self.page_info_prev = tk.Button(self.page_info, text='Prev Page', command=self.prev_page)
self.page_info_prev.pack(side='left')
self.page_info_text = tk.Label(self.page_info)
self.page_info_text.pack(side='left')
self.page_info_next = tk.Button(self.page_info, text='Next Page', command=self.next_page)
self.page_info_next.pack(side='right')
for r in range(self.grid[1]):
for c in range(self.grid[0]):
tk.Label(self.image_frame).grid(row=r, column=c)
self.update()
self.root.bind('<Escape>', quit)
self.root.bind('<Left>', self.prev_page)
self.root.bind('<Right>', self.next_page)
self.root.bind('<Button-1>', self.set_selected)
self.root.mainloop()
def update(self):
self.set_selected()
self.page_info_text.configure(text='{} / {}'.format(self.get_page_number() + 1, self.get_total_pages_number()))
for w in self.image_frame.grid_slaves():
global_index = self.index + int(w.grid_info()['row']) * self.grid[0] + int(w.grid_info()['column'])
if 0 <= global_index < len(self.data):
image = self.load_image(self.data.iloc[global_index])
w.configure(image=image)
w.image = image
else:
w.configure(image='')
def load_image(self, row):
return ImageTk.PhotoImage(Image.open('images/' + row.name + '.png'))
def remove(self, event=None):
if not self.selected: return
self.data.drop(self.selected, inplace=True)
self.raw_data.drop(self.selected, inplace=True)
self.update()
def save(self, event=None):
self.raw_data.to_csv(self.directory + self.filename_output)
def set_selected(self, event=None):
for w in self.image_frame.grid_slaves():
w.configure(bg='black')
if event:
info = event.widget.grid_info()
global_index = self.index + int(info['row']) * self.grid[0] + int(info['column'])
row = self.data.iloc[global_index]
self.selected = row.name
event.widget.configure(bg='white')
self.info.configure(text=self.data.loc[self.selected])
else:
self.selected = None
self.info.configure(text='')
def prev_page(self, event=None):
if self.get_page_number() <= 0: return
self.index -= self.index_diff
self.update()
def next_page(self, event=None):
if self.get_page_number() >= self.get_total_pages_number() - 1: return
self.index += self.index_diff
self.update()
def get_page_number(self):
return int(np.floor(self.index / self.index_diff))
def get_total_pages_number(self):
return int(np.ceil( len(self.data) / self.index_diff))
def quit(self):
self.root.destroy()
if __name__ == "__main__":
viewer = Viewer('', 'data.csv', 'data_out.csv')
# viewer.filter('didGrasp == 1')
viewer.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment