Created
December 11, 2017 23:08
-
-
Save pantor/5ba3e1e4436e9b5c07bf507e2cd9cb45 to your computer and use it in GitHub Desktop.
Image Viewer
This file contains hidden or 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/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