Source code for kalmus.tkinter_windows.time_points_windows.CheckTimePointWindow

""" CheckTimePointWindow Class """

import tkinter
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
import numpy as np

from kalmus.tkinter_windows.gui_utils import get_time, resource_path


[docs]class CheckTimePointWindow(): """ CheckTimePointWindow GUI window that shows the RGB/Brightness value, RGB color, x, y position, frame indexes and time at the clicked point """ def __init__(self, barcode, mouse_x, mouse_y, figsize=(6, 0.7), dpi=100): """ Initialize :param barcode: The barcode with clicked point :param mouse_x: The x position of the clicked point :param mouse_y: The y position of the clicked point """ self.barcode = barcode self.x_pos = mouse_x self.y_pos = mouse_y frame, time_hr, time_min, time_sec = get_time(self.barcode, self.x_pos, self.y_pos) # Initialize the window self.window = tkinter.Tk() self.window.wm_title("At this point...") self.window.iconbitmap(resource_path("kalmus_icon.ico")) self.window.attributes('-topmost', True) # If the clicked barcode is color barcode if self.barcode.barcode_type == "Color": # Get the r, g, b value at that point r, g, b = barcode.get_barcode().astype("uint8")[self.y_pos, self.x_pos] # Set up the label color_r_label = tkinter.Label(master=self.window, text="Red: {:d}".format(r), fg='#9E1A1A') color_r_label.grid(row=0, column=0) color_g_label = tkinter.Label(master=self.window, text="Green: {:d}".format(g), fg='#028A0F') color_g_label.grid(row=0, column=1) color_b_label = tkinter.Label(master=self.window, text="Blue: {:d}".format(b), fg='#1520A6') color_b_label.grid(row=0, column=2) # Show the color color_label = tkinter.Label(master=self.window, text="", bg=f'#{r:02x}{g:02x}{b:02x}', width=6, height=2) color_label.grid(row=0, column=3, rowspan=2, padx=5, pady=5) elif self.barcode.barcode_type == "Brightness": # Get the brightness value (notices that r = g = b = brightness) r = g = b = barcode.get_barcode().astype("uint8")[self.y_pos, self.x_pos] brightness_value_label = tkinter.Label(master=self.window, text="Brightness: {:d}".format(r)) brightness_value_label.grid(row=0, column=0) # Set up the label brightness_label = tkinter.Label(master=self.window, text="", bg=f'#{r:02x}{g:02x}{b:02x}', width=12, height=1) # Show the brightness brightness_label.grid(row=0, column=1, columnspan=1, padx=5, pady=3) # Show the position pos_label = tkinter.Label(master=self.window, text="Position: ({:d}, {:d}) ".format(self.x_pos, self.y_pos)) pos_label.grid(row=1, column=0) # Show the frame index self.frame_label = tkinter.Label(master=self.window, text="Frame: {:d} ".format(frame)) self.frame_label.grid(row=1, column=1) # Show the time self.time_label = tkinter.Label(master=self.window, text="Time: {:02d}:{:02d}:{:02d} " .format(time_hr, time_min, time_sec)) self.time_label.grid(row=1, column=2) if self.barcode.saved_frames is not None: # Set up the plotted figure self.fig = plt.figure(figsize=figsize, dpi=dpi) displayed_image = self.get_frames_image_for_display(mouse_x, mouse_y) plt.imshow(displayed_image) plt.axis('tight') plt.axis("off") plt.tight_layout() self.fig.subplots_adjust(left=0,right=1,bottom=0,top=1) # Set up the canvas for the figure self.canvas = FigureCanvasTkAgg(self.fig, master=self.window) # A tk.DrawingArea. self.canvas.draw() self.canvas.get_tk_widget().grid(row=2, column=0, rowspan=1, columnspan=4)
[docs] def get_frames_image_for_display(self, mouse_x, mouse_y): """ Get the frames around the clicked point :param mouse_x: The x position of the clicked point :param mouse_y: The y position of the clicked point :return: The combined sampled frames for displaying """ barcode_shape = self.barcode.get_barcode().shape # Get the middle position of the saved frame cur_pos = (mouse_x * barcode_shape[0] + mouse_y) / (barcode_shape[0] * barcode_shape[1]) frame_pos = round(cur_pos * len(self.barcode.saved_frames)) # Get another four frames around the middle frame # Make sure the frame positions/indexes are valid if frame_pos < 2: frame_pos = 2 if frame_pos > len(self.barcode.saved_frames) - 3: frame_pos = len(self.barcode.saved_frames) - 3 frames = self.barcode.saved_frames[frame_pos - 2: frame_pos + 3] # Get the combined five frames image combine_image = frames[0] for frame in frames[1:]: # Combine the frames into one image combine_image = np.concatenate((combine_image, frame), axis=1) return combine_image