def run(self): def open_button_path_fun(path): return path tk.Label(self.window, text='File Size Inspector', font=font.Font(family='Helvetica', size=14, weight='bold')).grid(row=0, column=0) tk.Label(self.window, text='').grid(row=1, column=0) frame = tk.Frame(self.window) tk.Label(frame, text=f'Current path: {Path(self.data_prepare_object.current_path).shorten_path_if_necessary()}', font=font.Font(family='Helvetica', size=12, weight='normal')).grid(row=0, column=0) tk.Label(frame, text=' ').grid(row=0, column=1) tk.Button(frame, text='CHANGE', command=lambda: [self.change_button_function()]).grid(row=0, column=2) frame.grid(row=2, column=0) tk.Label(self.window, text='').grid(row=3, column=0) sf = ScrolledFrame(self.window, width=520, height=425) sf.grid(row=5, column=0) sf.bind_arrow_keys(self.window) sf.bind_scroll_wheel(self.window) sf.focus() inner_frame = sf.display_widget(tk.Frame) frame = tk.Frame(inner_frame) i = 0 for header_name in list(self.fields_width_dictionary.keys()): l_box = tk.Listbox(frame, bg=self.window['bg'], justify=tk.CENTER, relief=tk.GROOVE, width=self.fields_width_dictionary[header_name], height=1, font=font.Font(family='Helvetica', size=10, weight='bold')) l_box.insert(0, header_name) l_box.grid(row=0, column=i) i += 1 frame.grid(row=5, column=0, sticky='W') if len(list(self.data_prepare_object.selected_elements_dictionary.keys())) > self.max_number_of_elements_on_screen: tk.Label(self.window, text=f'Showing {self.max_number_of_elements_on_screen} largest elements from this directory.', fg='#e67300', font=font.Font(family='Helvetica', size=10, weight='normal')).grid(row=4, column=0) i = 0 paths = list(self.data_prepare_object.selected_elements_dictionary.keys()) for entry_path in paths: frame = tk.Frame(inner_frame) content_dictionary = dict(zip(self.fields, [self.data_prepare_object.selected_elements_dictionary[entry_path].name, self.data_prepare_object.selected_elements_dictionary[entry_path].type, f'{self.data_prepare_object.selected_elements_dictionary[entry_path].size} {self.data_prepare_object.selected_elements_dictionary[entry_path].size_unit}'])) j = 0 for column_name in list(content_dictionary.keys()): l_box_name = tk.Listbox(frame, width=self.fields_width_dictionary[column_name], height=1, font=font.Font(family='Helvetica', size=10, weight='normal')) l_box_name.insert(0, content_dictionary[column_name]) l_box_name.grid(row=0, column=j) j += 1 if self.data_prepare_object.selected_elements_dictionary[entry_path].can_open: button = tk.Button(frame, text='OPEN', command=lambda c=i: [self.move_function(partial(open_button_path_fun, paths[c]).args[0])]) button.grid(row=0, column=i+3) frame.grid(row=i+7, column=0, sticky='W') i += 1 if i > self.max_number_of_elements_on_screen: break previous_location = Path(self.data_prepare_object.current_path).get_path_previous_location() if previous_location is not None: tk.Button(self.window, text='BACK', font=10, command=lambda: [self.move_function(previous_location)]).grid(row=i+8, column=0) self.window_on_top_update() self.adjust_window_position() self.window.mainloop()
class CoronaDB: def __init__(self, master): self.master = master self.createWidgets() def createWidgets(self): style = ttk.Style() style.theme_use("clam") style.configure( "LightText.TFrame", background=COLOUR_SECONDARY, foreground=COLOUR_LIGHT_TEXT, ) style.configure( "LightText.TLabel", background=COLOUR_PRIMARY, foreground=COLOUR_LIGHT_TEXT, ) style.configure( "Button.TButton", background=COLOUR_SECONDARY, foreground=COLOUR_PRIMARY, ) self.corona_label = ttk.Label(self.master, text='Corona Virus Data Calculator', style="LightText.TLabel", font=('helvetica', 20)) self.corona_label.grid(row=0, sticky='N', padx=50, pady=25) self.button = ttk.Button(text='Show(Country)', command=self.getcorona, style="Button.TButton") self.button.grid(row=2, sticky='W', padx=50, pady=5) self.button1 = ttk.Button(text='Show(All)', command=self.allcompare, style="Button.TButton") self.button1.grid(row=2, sticky='E', padx=50, pady=5) # self.corona_frame = ttk.Frame(self.master, borderwidth = 5, width=500, height=250, relief='groove', style="LightText.TFrame") # self.corona_frame.grid_propagate(False) # self.corona_frame.grid(row=3, sticky='w', padx=50, pady=5) self.corona_frame = ScrolledFrame(self.master, borderwidth = 5, width=400, height=220, bg='black') self.corona_frame.grid(row=4, sticky='w', padx=50, pady=5) # Bind the arrow keys and scroll wheel self.corona_frame.bind_arrow_keys(self.master) self.corona_frame.bind_scroll_wheel(self.master) self.inner_frame = self.corona_frame.display_widget(Frame) options = [ "World", "Czech Republic", "India", "United States of America", "Spain", "Italy", "France", "Germany", "China", "United Kingdom", "Turkey", "Belgium", "Switzerland", "Netherlands", "Canada", "Brazil", "Portugal", "Austria", "Pakistan", ] self.clicked = StringVar() self.clicked.set(options[0]) self.drop = OptionMenu(self.master, self.clicked, *options) self.drop.config(bg = "#808080") self.drop["menu"].config(bg="white") self.drop.grid(row=1, sticky='W', padx=50, pady=5) def allcompare(self): if self.inner_frame.grid_slaves(): self.clearContents() endpoint = "https://api.covid19api.com/summary" response = requests.get(endpoint) corona = response.json() dict = {} for data in corona['Countries']: new_dict = {**dict, **{data['Country']: data['TotalConfirmed']}} dict = new_dict sorted_data = sorted(dict.items(), key=operator.itemgetter(1),reverse=True) i = 1 for item in sorted_data: text_val1 = item[0] text_val2 = item[1] ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val1, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=2) ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val2, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=4) i = i + 1 def getcorona(self): if self.inner_frame.grid_slaves(): self.clearContents() endpoint = "https://api.covid19api.com/summary" response = requests.get(endpoint) corona = response.json() # corona data in json format dd_clicked = self.clicked.get() keys = {'NewConfirmed': 'New Confirmed', 'TotalConfirmed': 'Total Cases', 'NewDeaths': 'New Deaths', 'TotalDeaths': 'Total Deaths', 'NewRecovered': 'New Recovered', 'TotalRecovered': 'Total Recovered'} if dd_clicked != "World": for country_data in corona['Countries']: if country_data['Country'] == dd_clicked: i = 1 for item in keys: text_val1 = keys[item] text_val2 = str(country_data[item]) ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val1, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=2) ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val2, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=4) i = i + 1 else: i = 1 for item in keys: text_val1 = keys[item] text_val2 = str(corona['Global'][item]) ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val1, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=2) ttk.Label(self.inner_frame, borderwidth = 3, width = 20, text=text_val2, font=('helvetica', 16), style="Button.TButton", wraplength=500).grid(row=i, column=4) i = i + 1 def clearContents(self): for widget in self.inner_frame.grid_slaves(): widget.destroy()
def person_query_ins(df): global person_data_list, person_sf, person_frame, person_first_search, person_sel_row #if the query returns more than 100 matches show a warnign message if df.shape[0] == 100: message("", 1) #if a movie search was already performed destroy the previously created scrollbar if person_first_search == 0: person_sf.destroy() person_frame.destroy() person_sel_row = [] if df.shape[0] > 15: person_sf = ScrolledFrame(person_results_frame, width=698, height=350, scrollbars="vertical", relief="flat") person_sf.grid(row=1, sticky="w", padx=(13, 0)) person_frame = person_sf.display_widget(tk.Canvas) else: person_sf = ScrolledFrame(person_results_frame, width=698, height=350, scrollbars="neither", relief="flat") person_sf.grid(row=1, sticky="w", padx=(13, 0)) person_frame = tk.Frame(person_results_frame) person_frame.grid(row=1, sticky="nw", padx=(14, 0)) person_data_list = [["" for y in range(4)] for x in range(df.shape[0])] #this part of the code populates the on-screen grid with informations for x in range(df.shape[0]): person_data_list[x][0] = tk.Label(person_frame, width=40, text=df.iloc[x][1], bg="white") person_data_list[x][0].grid(row=x, column=0, padx=1, pady=1) person_data_list[x][0].bind( "<1>", lambda event: handle_click(event, "person")) if df.iloc[x][2] != None: person_data_list[x][1] = tk.Label(person_frame, width=15, text=re.search( r"\d{4}", str(df.iloc[x][2]))[0], bg="white") else: person_data_list[x][1] = tk.Label(person_frame, width=15, text=df.iloc[x][2], bg="white") person_data_list[x][1].grid(row=x, column=1, padx=1, pady=1) person_data_list[x][1].bind( "<1>", lambda event: handle_click(event, "person")) person_data_list[x][2] = tk.Label(person_frame, width=20, text=df.iloc[x][3], bg="white") person_data_list[x][2].grid(row=x, column=2, padx=1, pady=1) person_data_list[x][2].bind( "<1>", lambda event: handle_click(event, "person")) person_data_list[x][3] = tk.Label(person_frame, width=20, text=df.iloc[x][4], bg="white") person_data_list[x][3].grid(row=x, column=3, padx=1, pady=1) person_data_list[x][3].bind( "<1>", lambda event: handle_click(event, "person")) for i in range(4): person_data_list[x][i].extra = (x * 4 + i) // 4 person_first_search = 0
class DataView(View): def __init__(self, parent): super().__init__(parent) self['text'] = 'Data' # self['bg'] = 'green' h = self.parent.winfo_reqheight() w = self.parent.winfo_reqwidth() self.grid() # self.grid_propagate(False) self.rowconfigure(0, weight=1) self.rowconfigure(1, weight=1) # self.rowconfigure(2, weight=1) # self.columnconfigure(0, pad=15) self.columnconfigure(0, weight=1) # Last existing output self._data_last = Frame(self, height=int(h*0.3), highlightbackground='gray', highlightthickness=1) self._data_last.grid(row=0, column=0, padx=PADX, pady=PADY_S, sticky=W + E + N + S) self._data_last.columnconfigure(0, weight=1) self._data_last.rowconfigure(0, weight=1) self._data_last.grid_propagate(False) # self._last_view = Label(self._data_last, name='last image') # Setup canvas inside the frame # self._canvas_data_last = Canvas(self._data_last, bg='green') # self._canvas_data_last.grid(row=0, column=0, padx=PADX_S, pady=PADY_S, sticky=W + E + N + S) #Add PIL image to the Canvas # canvas.create_image(10,10,anchor=NW,image=img) # Preview content will be scrolable self.content = ScrolledFrame(self, height=int(h*0.3), use_ttk=True) # Bind the arrow keys and scroll wheel # self.content.bind_arrow_keys(self) # self.content.bind_scroll_wheel(self) self.content.grid(row=1, column=0, padx=PADX, pady=PADY_S, sticky=W + E + N + S) # Create the preview frame within the ScrolledFrame self.preview_view = self.content.display_widget(Frame) # self.data_actions = Frame(self, height=int(h*0.2), highlightbackground='gray', highlightthickness=1) # self.data_actions.grid(row=2, column=0, padx=PADX, pady=PADY_S, sticky=W + E + S) # self.data_actions.columnconfigure(0, weight=1) # self.data_actions.columnconfigure(1, weight=1) # self.data_actions.columnconfigure(2, weight=1) # self.data_actions.columnconfigure(3, weight=1) # self.data_actions.columnconfigure(4, weight=1) # self._preview_height = DEFAULT_VIEW_SIZE # self._preview_width = DEFAULT_VIEW_SIZE # self.scale_frame = LabelFrame(self.data_actions, text='Preview size:') # self.scale_frame.grid(row=0, column=0, columnspan=4, padx=PADX_S, pady=PADY_S, sticky=W+E) # self.scale_frame.columnconfigure(0, weight=1) # self.scale_frame.columnconfigure(1, weight=1) # self.scale_frame.columnconfigure(2, weight=1) # self.scale_frame.columnconfigure(3, weight=1) # self.var_h = IntVar() # self.var_h.set(self._preview_height) # self.scale_h = Scale(self.scale_frame, from_=50, to=500, resolution=50, variable=self.var_h, orient=HORIZONTAL, length=400) # self.scale_h.grid(row=0, column=0, columnspan=3, padx=PADX_S, pady=PADY_S, sticky=W+E) # self.scale_h.bind("<ButtonRelease-1>", self._set_h) # self.var_fixed_size = BooleanVar() # self.fixed_size = Checkbutton(self.scale_frame, variable=self.var_fixed_size, text='Fixed size', onvalue=True, offvalue=False, command=self._fix_size) # self.fixed_size.grid(row=0, column=3, padx=PADX_S, pady=PADY_S, sticky=W+E) # self.btn_save = Button(self.data_actions, text='Save', width=BTNW_S, command=self._save) # self.btn_save.grid(row=0, column=4, padx=PADX, pady=PADY) self._out = None self._idx_map :Dict = {} self._grid_rows: List[Widget] = [] self._storage: FlowStorage = None self._last_view = None return @property def storage(self) -> FlowStorage: return self._storage @storage.setter def storage(self, storage) -> None: self._storage = storage return def clear_view(self) -> None: self._out = None self._idx_map = {} for row in self._grid_rows: row.grid_remove() self._grid_rows.clear() self.content.scroll_to_top() if self._last_view is not None: self._last_view.grid_remove() return def default(self) -> None: # if self.var_fixed_size.get(): # return self._preview_height = DEFAULT_VIEW_SIZE self._preview_width = DEFAULT_VIEW_SIZE # self.var_h.set(self._preview_height) self._preview() return def _preview_size(self, image) -> Tuple[int,int]: (h, w) = image.shape[:2] ratio = w/h if h > self._preview_height: h = self._preview_height w = int(h*ratio) elif w > self._preview_width: w = self._preview_width h = int(w/ratio) elif h < self._preview_height and w < self._preview_width: h = self._preview_height w = int(h*ratio) else: pass return (w, h) def _fit_image(self, image): dim = self._preview_size(image) image = cv2.resize(image, dim, interpolation=cv2.INTER_NEAREST) return image def _preview_image_list(self, parent, image: List[np.ndarray], name: str) -> Widget: image = cv2.hconcat(image) return self._preview_image(parent, image, name) def _preview_image(self, parent, image: np.ndarray, name: str) -> Widget: preview = self._fit_image(image) pil_image = Image.fromarray(preview) photo = ImageTk.PhotoImage(pil_image) view = Label(parent, name=name, image=photo) view.image = photo return view def _preview_object(self, parent, data: any, name: str) -> Widget: view = Label(parent, name=name, border=1) # text = json.dumps(data, indent = 3) # df = pd.DataFrame(data) view.config(text = data) return view def _get_preview(self, ref_type: FlowDataType) -> Callable: views = { FlowDataType.NP_ARRAY: self._preview_image, FlowDataType.LIST_NP_ARRAYS: self._preview_image_list } return views.get(ref_type, self._preview_object) def _clear_preview(self, idx: int) -> None: if len(self._grid_rows) > 0: self._out = None # map idx to preview idx row_idx = self._get_row_idx(f'{idx}') if row_idx == WITHOUT_PREVIEW_DATA: return row_idx = max(len(self._idx_map)-1, self._get_row_idx(f'{idx}')) try: # remove idx mapping for the idx self._idx_map.pop(f'{row_idx}') # remove existing preview item with the idx res = self._grid_rows.pop(row_idx) res.grid_remove() except IndexError: pass return def update_result(self, idx: int, state_id: str) -> None: self._show_last(state_id) self. _clear_preview(idx) return def _create_row_output_container(self, row_idx: int, title: str) -> Widget: state_frame = LabelFrame(self.preview_view, name=f'--{row_idx}--', text=title) state_frame.grid(row=row_idx, column=0, sticky=W) state_frame.rowconfigure(0, pad=15) state_frame.columnconfigure(0, weight=1) state_frame.columnconfigure(0, pad=15) # state_frame.columnconfigure(1, weight=1) # state_frame.columnconfigure(1, pad=15) return state_frame def _create_preview(self, row_idx, title, out_data, out_refs) -> None: preview_frame = self._create_row_output_container(row_idx, title) # previews for a state outputs for i, ref in enumerate(out_refs): (ref_extr, ref_intr, ref_type) = ref data = out_data.get(ref_intr) if data is None: continue preview = self._get_preview(ref_type) # convert to a conventional format (without '.') name = ref_extr.replace('.', '-') widget = preview(preview_frame, data, name) widget.grid(row=i, column=0, sticky=W) widget.bind('<Button-1>', self._on_click) try: # remove existing item with the row_idx self._grid_rows.pop(row_idx) except IndexError: pass # set new one self._grid_rows.insert(row_idx, preview_frame) # Scroll view if need self.update_idletasks() h = preview_frame.winfo_height() self.content.focus_set() self.content.yview(SCROLL, h, UNITS) return def _get_row_idx(self, state_id: str) -> int: row_idx = self._idx_map.get(state_id, WITHOUT_PREVIEW_DATA) return row_idx @staticmethod def _parse_out_refs(refs) -> Tuple[str, str]: parts =refs[0][0].split('-') state_id = parts[0] title = '-'.join(parts[0:len(parts)-1]) return state_id, title def _show_last(self, state_id: str) -> None: out_data = self._storage.get_state_output_data(state_id) refs = self._storage.get_state_output_refs(state_id) if out_data is None or refs is None: return out_refs = [(ref.ext_ref, ref.int_ref, ref.data_type) for ref in refs] if len(out_refs) > 0: ref = out_refs[0] (ref_extr, ref_intr, ref_type) = ref data = out_data.get(ref_intr) if data.dtype == np.dtype('uint8'): pil_image = Image.fromarray(data) photo = ImageTk.PhotoImage(pil_image) self._last_view = Label(self._data_last, name='last image', image=photo) self._last_view.image = photo self._last_view.grid(row=0, column=0, padx=PADX_S, pady=PADY_S, sticky=W + E + N + S) else: self._last_view.grid_remove() # self._canvas_data_last.create_image(x1=10, y1=10, anchor=NW, image=photo) return def _preview(self) -> None: if self._out is None: return (out_refs, out_data) = self._out if len(out_refs) > 0: state_id, title = self._parse_out_refs(out_refs) row_idx = self._get_row_idx(state_id) self._create_preview(row_idx, title, out_data, out_refs) return def _map_idx_to_row_idx(self, idx: int) -> None: preview_row = len(self._idx_map) (out_refs, out_data) = self._out if len(out_refs) == 0 and len(out_data) == 0: # No data for preview self._idx_map[f'{idx}'] = WITHOUT_PREVIEW_DATA return # map idx to row_idx self._idx_map[f'{idx}'] = min(idx, preview_row) return def _show_preview(self, idx: int, state_id: str) -> None: out_data = self._storage.get_state_output_data(state_id) refs = self._storage.get_state_output_refs(state_id) if out_data is None or refs is None: return out_refs = [(ref.ext_ref, ref.int_ref, ref.data_type) for ref in refs] self._out = (out_refs, out_data) self._map_idx_to_row_idx(idx) self._preview() return def show_result(self, idx: int, state_id: str) -> None: self._show_preview(idx, state_id) self._show_last(state_id) return def _on_click(self, event) -> None: event.widget.focus_set() active_widget_name = event.widget._name print(active_widget_name) for row in self._grid_rows: for child in row.children: if child == active_widget_name: self._plot(child) return def _plot(self, name: str) -> None: parts = name.split('-') state_id = parts[0] + '-' + parts[2] key = parts[3] data_dict = self._storage.get_state_output_data(state_id) data = data_dict.get(key) plot_dlg = PlotDialog(self, name, data) return def _set_h(self, event) -> None: self._preview_height = self.scale_h.get() self._preview() return def _fix_size(self) -> None: # self.scale_h['state'] = NORMAL # if self.var_fixed_size.get() == True: # self.scale_h['state'] = DISABLED return def _save(self) -> None: print('save') return # TODO: # https://stackoverflow.com/questions/28005591/how-to-create-a-scrollable-canvas-that-scrolls-without-a-scroll-bar-in-python def _move(self, preview_frame): deltay = self._preview_height deltax = self._preview_width # make sure we don't move beyond our scrollable region (x0,y0,x1,y1) = self.content._canvas.coords() deltay = 0 if (deltay > 0 and y1 >= 400) else deltay deltay = 0 if (deltay < 0 and y0 <= -400) else deltay deltax = 0 if (deltax > 0 and x1 >= 400) else deltax deltax = 0 if (deltax < 0 and x0 <= -400) else deltax # move the item, then scroll it into view self.content._canvas.move(preview_frame, deltax, deltay) self._make_visible(preview_frame) def _make_visible(self, preview_frame) -> None: # determine the bounding box of the visible area of the screen (cx0,cy0) = (self.content._canvas.canvasx(0), self.content._canvas.canvasy(0)) (cx1,cy1) = (self.content._canvas.canvasx(self.content._canvas.cget("width")), self.content._canvas.canvasy(self.content._canvas.cget("height"))) # determine the bounding box of the thing to be made visible (x0,y0,x1,y1) = self.content._canvas.coords(preview_frame) # determine how far off the screen the object is deltax = x0-cx0 if x0 <= cx0 else x1-cx1 if x1 >= cx1 else 0 deltay = y0-cy0 if y0 <= cy0 else y1-cy1 if y1 >= cy1 else 0 # scroll the canvas to make the item visible self.canvas.xview("scroll", int(deltax), "units") self.canvas.yview("scroll", int(deltay), "units") return
def movie_query_ins(df): global movie_data_list, movie_sf, movie_frame, movie_first_search, movie_sel_row #if the query returns more than 100 matches show a warnign message if df.shape[0] == 100: message("", 1) #if a movie search was already performed destroy the previously created scrollbar if movie_first_search == 0: movie_sf.destroy() movie_frame.destroy() movie_sel_row = [] if df.shape[0] > 14: movie_sf = ScrolledFrame(movie_results_frame, width=700, height=320, scrollbars="vertical", relief="flat") movie_sf.grid(row=1) movie_frame = movie_sf.display_widget(tk.Canvas) else: movie_sf = ScrolledFrame(movie_results_frame, width=700, height=320, scrollbars="neither", relief="flat") movie_sf.grid(row=1, sticky="w", padx=(13, 0)) movie_frame = tk.Frame(movie_results_frame) movie_frame.grid(row=1, sticky="nw", padx=(14, 0)) movie_data_list = [["" for y in range(6)] for x in range(df.shape[0])] #this part of the code populates the on-screen grid with informations for x in range(df.shape[0]): movie_data_list[x][0] = tk.Label(movie_frame, width=5, text=df.iloc[x][1], bg="white") movie_data_list[x][0].grid(row=x, column=0, padx=1, pady=1) movie_data_list[x][0].bind("<1>", lambda event: handle_click(event, "movie")) if len(df.iloc[x][2]) > 43: movie_data_list[x][1] = tk.Label(movie_frame, width=35, text=df.iloc[x][2][:43] + ".", bg="white") else: movie_data_list[x][1] = tk.Label(movie_frame, width=35, text=df.iloc[x][2], bg="white") movie_data_list[x][1].grid(row=x, column=1, padx=1, pady=1) movie_data_list[x][1].bind("<1>", lambda event: handle_click(event, "movie")) movie_data_list[x][2] = tk.Label(movie_frame, width=7, text=df.iloc[x][3], bg="white") movie_data_list[x][2].grid(row=x, column=2, padx=1, pady=1) movie_data_list[x][2].bind("<1>", lambda event: handle_click(event, "movie")) movie_data_list[x][3] = tk.Label(movie_frame, width=10, text=re.search( r"\w+[^,]", df.iloc[x][4])[0], bg="white") movie_data_list[x][3].grid(row=x, column=3, padx=1, pady=1) movie_data_list[x][3].bind("<1>", lambda event: handle_click(event, "movie")) if df.shape[1] == 6: movie_data_list[x][4] = tk.Label(movie_frame, width=20, text="", bg="white") movie_data_list[x][5] = tk.Label(movie_frame, width=16, text="", bg="white") else: movie_data_list[x][4] = tk.Label(movie_frame, width=20, text=df.iloc[x][5], bg="white") movie_data_list[x][5] = tk.Label(movie_frame, width=16, text=df.iloc[x][6], bg="white") movie_data_list[x][4].grid(row=x, column=4, padx=1, pady=1) movie_data_list[x][4].bind("<1>", lambda event: handle_click(event, "movie")) movie_data_list[x][5].grid(row=x, column=5, padx=1, pady=1) movie_data_list[x][5].bind("<1>", lambda event: handle_click(event, "movie")) for i in range(6): movie_data_list[x][i].extra = (x * 6 + i) // 6 movie_first_search = 0
listbox_ip.grid(row=1, column=0, columnspan=1, sticky='n') listbox_ip.bind("<Button-1>", ip_auto_fill) listbox_ip.bind("<Return>", ip_search) Scrollbar(frame_ip, command=listbox_ip.yview, orient=VERTICAL).grid(row=1, column=2, sticky='ns') for i, v in enumerate(all_ip_tup): listbox_ip.insert( 'end', str(i + 1) + '.) ' + v[0] + " " + v[1] + " " + str(v[2]) + " " + str(v[3])) #plot################################################ # Create a ScrolledFrame widget sf = ScrolledFrame(root, width=1500, height=750) sf.grid(row=1, column=0, columnspan=3) # Bind the arrow keys and scroll wheel sf.bind_scroll_wheel(root) # Create a frame within the ScrolledFrame inner_frame = sf.display_widget(Frame) frame_plot = Frame(inner_frame) frame_plot.grid(row=0, column=0) tog() #toggsearch ######IP################## ##########ip fig = plt.Figure(figsize=(6, 5), dpi=75) pl = fig.add_subplot(111, title="Top 10 IP", xlabel="IP", ylabel="Records") try:
class LinksView(View): def __init__(self, parent): super().__init__(parent) self['text'] = 'Links' self.update_idletasks() h = self.parent.winfo_reqheight() w = self.parent.winfo_reqwidth() self._flow = None self._grid_rows_descr: List[Dict] = [] self._possible_input: List[str] = [] self._active_wd_idx = -1 self.grid() self.rowconfigure(0, weight=1) self.rowconfigure(1, weight=1) self._infovar = StringVar() self._info_entry = Entry(self, name='flow_info', textvariable=self._infovar, width=35) self._info_entry.grid(row=0, column=0, padx=PADX, pady=PADY, sticky=N + W + E) self._info_desr = { 'getter': self._infovar.get, 'setter': self._infovar.set, 'wd': self._info_entry } # Content will be scrolable self._content = ScrolledFrame(self, use_ttk=True, height=int(h / 5), width=int((w / 2))) self._content.grid(row=1, column=0, padx=PADX, pady=PADY_S, sticky=W + E) # Create the params frame within the ScrolledFrame self._links_view = self._content.display_widget(Frame) return @property def descriptors(self) -> List[Dict]: return self._grid_rows_descr @property def info_descr(self) -> str: return self._info_desr def get_active_item_link_descriptors(self) -> List[List[Widget]]: if self._active_wd_idx < 0: return None descriptors = self._grid_rows_descr[self._active_wd_idx] return descriptors def clear(self) -> None: self._infovar.set('') for child in self._links_view.winfo_children(): child.grid_remove() self._grid_rows_descr.clear() self._content.scroll_to_top() self._possible_input.clear() self._active_wd_idx = -1 return def build(self, flow: FlowModel) -> None: self._flow = flow self._infovar.set(flow.info) items = copy.deepcopy(flow.items) for i, item in enumerate(items): item_links_frame = self._create_item_links_container(i + 1, item) item_links_frame.grid(row=i + 1, column=0, padx=PADX, sticky=W + E) item_links_frame.columnconfigure(0, weight=1) item_links_frame.columnconfigure(1, weight=1) item_links_descr = self._create_item_links_widgets( item_links_frame, i, item) self._grid_rows_descr.append(item_links_descr) self._disable_all() self._active_wd_idx = 0 self._hightlighte_active_wd(True) self._set_active_wd_state(True) return def _create_item_links_container(self, idx: int, item: FlowItemModel) -> Widget: i_n = item.name.replace('.', '-') name = f'--{idx}-{i_n}--' item_links_frame = LabelFrame(self._links_view, name=name) return item_links_frame def _create_item_links_widgets(self, container: LabelFrame, idx: int, item: FlowItemModel) -> Dict: item_links_descr = [] title = f'{idx}-{item.name}' i_n = item.name.replace('.', '-') name = f'--{idx}-{i_n}--' item_label = Label(container, name=name, text=title) item_label.grid(row=0, column=0, padx=PADX_S, pady=PADY_S, sticky=W) item_links_descr.append({ 'name': item_label.winfo_name(), 'getter': None, 'setter': None, 'wd': item_label }) infovar = StringVar() infovar.set(item.title) info_entry = Entry(container, textvariable=infovar, width=38) info_entry.grid(row=0, column=1, padx=PADX_S, pady=PADY_S, sticky=E) item_links_descr.append({ 'name': info_entry.winfo_name(), 'getter': infovar.get, 'setter': None, 'wd': info_entry }) inrefs_def = item.inrefs_def outrefs_def = item.outrefs_def for i, outref_def in enumerate(outrefs_def): outref_name = outref_def.get('name') self._possible_input.append(f'{title}-{outref_name}') links = item.links if len(inrefs_def) > 0: for i, inref_def in enumerate(inrefs_def): inref_name = inref_def.get('name') getter, inref_lbl, inref_combo = self._create_link_widget( container, inref_name, links) inref_lbl.grid(row=i + 1, column=0, padx=PADX_S, pady=PADY_S, sticky=W) inref_combo.grid(row=i + 1, column=1, columnspan=2, padx=PADX_S, pady=PADY_S, sticky=E) item_links_descr.append({ 'name': inref_name, 'getter': getter, 'setter': None, 'wd': inref_combo }) return item_links_descr def _create_link_widget( self, container: LabelFrame, inref_name: str, links: Dict[str, str]) -> Tuple[Callable, Widget, Widget]: def get(): return inref_combo.get() text = f'{inref_name}:' inref_lbl = Label(container, text=text, anchor=W, justify=LEFT, width=10) var = StringVar() inref_combo = Combobox(container, name=inref_name, justify=LEFT, width=35) inref_combo['values'] = copy.deepcopy( self._possible_input[:len(self._possible_input) - 2]) # Assign current value if len(links) > 0: link = links.get(inref_name) if link is not None: inref_combo.set(link) inref_combo.textvariable = var return get, inref_lbl, inref_combo def set_active_wd(self, idx: int) -> None: self._hightlighte_active_wd() self._set_active_wd_state() self._active_wd_idx = idx self._hightlighte_active_wd(True) self._set_active_wd_state(True) return def _set_active_wd_state(self, active: bool = False) -> None: state = DISABLED if active: state = NORMAL descriptors = self._grid_rows_descr[self._active_wd_idx] for descr in descriptors: widget = descr.get('wd') widget['state'] = state return def _disable_all(self) -> None: for descriptors in self._grid_rows_descr: for descr in descriptors: widget = descr.get('wd') widget['state'] = DISABLED return # UI methods def _hightlighte_active_wd(self, active: bool = False) -> None: fg_color = 'black' bg_color = 'SystemButtonFace' if active: fg_color = 'white' bg_color = 'RoyalBlue' descriptors = self._grid_rows_descr[self._active_wd_idx] for descr in descriptors: widget = descr.get('wd') name = widget.winfo_name() if name.startswith('--'): widget['fg'] = fg_color widget['bg'] = bg_color break return
class LinksDialog(Toplevel): def __init__(self, parent, flow: CurrentFlowModel, callback: Callable): super().__init__(parent) self._flow = flow self._callback = callback # Do the dialog modal self.transient(parent) self.grab_set() # Define the dialog size self.title('Configure:') self.geometry("550x845+%d+%d" % (parent.winfo_rootx() + 920, parent.winfo_rooty() + 30)) self.resizable(height=FALSE, width=FALSE) self.grid() self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.rowconfigure(1, weight=20) self.rowconfigure(2, weight=1) self._info = LabelFrame(self) self._info.columnconfigure(0, weight=1) self._info.columnconfigure(1, weight=5) self._info_lbl = Label(self._info, text='flow info:') self._info_lbl.grid(row=0, column=0, sticky=W) self._info_name_var = StringVar() self._info_name_var.set(flow.flow.info) self._info_entry = Entry(self._info, width=50, textvariable=self._info_name_var) self._info_entry.grid(row=0, column=1, padx=PADX, pady=PADY, sticky=W + E + N + S) self._info.grid(row=0, column=0, columnspan=2, padx=PADX, pady=PADY, sticky=W + E + N + S) # Content will be scrolable self.content = ScrolledFrame(self) # Bind the arrow keys and scroll wheel self.content.bind_arrow_keys(self) self.content.bind_scroll_wheel(self) # Create the ContentView frame within the ScrolledFrame self.content_view = self.content.display_widget(ContentView) self.content_view.init_content(flow) self.content.grid(row=1, column=0, padx=PADX, pady=PADY, sticky=W + E + N + S) self.actions_frame = LdActionsFrame(self) self.actions_frame.grid(row=2, column=0, padx=PADX, pady=PADY, sticky=W + E + N + S) return def apply(self) -> None: self.content_view.update_flow() self._flow.flow = copy.deepcopy(self.content_view.tmp_flow) self._flow.flow.info = self._info_name_var.get() self._callback() self.destroy() return def cancel(self) -> None: self.destroy() return
class ParamsView(View): def __init__(self, parent): super().__init__(parent) self['text'] = 'Parameters' self._factory = ParamWidgetFactory() self.update_idletasks() h = self.parent.winfo_reqheight() self._flow = None self._grid_rows_descr: List[Dict] = [] self._active_wd_idx = -1 self.grid() self.rowconfigure(0, weight=1) self.rowconfigure(1, weight=1) # Content will be scrolable self._content = ScrolledFrame(self, use_ttk=True, height=int(h * 0.65)) self._content.grid(row=0, column=0, padx=PADX, pady=PADY_S, sticky=N + S + W + E) # Create the params frame within the ScrolledFrame self._params_view = self._content.display_widget(Frame) # Setup param actions view self._params_actions_frame = Frame(self, highlightbackground='gray', highlightthickness=1) self.btn_params_reset = Button(self._params_actions_frame, text='Reset', width=BTNW_S) self.btn_params_default = Button(self._params_actions_frame, text='Default', width=BTNW_S) self.btn_params_io = Button(self._params_actions_frame, text='I/O', width=BTNW_S) self.btn_params_reset.grid(row=0, column=0, padx=PADX, pady=PADY_S, sticky=W + N) self.btn_params_default.grid(row=0, column=1, padx=PADX, pady=PADY_S, sticky=W + N) self.btn_params_io.grid(row=0, column=2, padx=PADX, pady=PADY_S, sticky=W + N) self._params_actions_frame.grid(row=1, column=0, padx=PADX, pady=PADY_S, sticky=W + E + S) self._activate_params_buttons() return # API @property def descriptors(self) -> List[Dict]: return self._grid_rows_descr def get_active_item_params_widgets(self) -> List[Widget]: if self._active_wd_idx < 0: return None descriptors = self._grid_rows_descr[self._active_wd_idx] widgets = [] for descr in descriptors: widget = descr.get('wd') widgets.append(widget) return widgets def get_item_name(self, idx: int) -> str: descriptors = self._grid_rows_descr[idx] widget_0 = descriptors[0].get('wd') parent_name = widget_0.winfo_parent() idx_s = parent_name.index('--') p_n: str = parent_name[idx_s + 2:len(parent_name) - 2] idx_point = p_n.find('-', 3) p_n = p_n[:idx_point] + '.' + p_n[idx_point + 1:] return p_n def get_item_params(self, idx: int) -> Dict: params = {} descriptors = self._grid_rows_descr[idx] for descr in descriptors: widget = descr.get('wd') name = widget.winfo_name() if name.startswith('--'): continue getter = descr.get('getter') value = getter() params[name] = value return params def set_item_params(self, idx: int, params) -> None: if self._active_wd_idx < 0: return None descriptors = self._grid_rows_descr[idx] for descr in descriptors: widget = descr.get('wd') name = widget.winfo_name() if name.startswith('--'): continue setter = descr.get('setter') setter(params.get(name)) return def clear(self) -> None: for child in self._params_view.winfo_children(): child.grid_remove() self._grid_rows_descr.clear() self._content.scroll_to_top() self._active_wd_idx = -1 self._activate_params_buttons() return # Build def build(self, flow: FlowModel) -> None: self._flow = flow items = copy.deepcopy(flow.items) for i, item in enumerate(items): item_params_frame = self._create_item_params_container(i, item) item_params_frame.grid(row=i, column=0, padx=PADX, sticky=W + E) self._factory.container = item_params_frame item_params_descr = self._create_item_params_widgets(i, item) self._grid_rows_descr.append(item_params_descr) self._disable_all() self._active_wd_idx = 0 self._hightlighte_active_wd(True) self._set_active_wd_state(True) self._activate_params_buttons(True) return def _create_item_params_container(self, idx: int, item: FlowItemModel) -> Widget: i_n = item.name.replace('.', '-') name = f'--{idx}-{i_n}--' item_params_frame = LabelFrame(self._params_view, name=name) return item_params_frame def _create_item_params_widgets(self, idx: int, item: FlowItemModel) -> Dict: item_params_descr = [] title = f'{idx}-{item.name}' i_n = item.name.replace('.', '-') name = f'--{idx}-{i_n}--' item_label = Label(self._factory.container, name=name, text=title) item_label.grid(row=0, column=0, columnspan=3, padx=PADX_S, pady=PADY_S, sticky=W) item_params_descr.append({ 'name': item_label.winfo_name(), 'getter': None, 'setter': None, 'wd': item_label }) params, params_def = self._merge_curent_params_with_params_ws(item) for i, param_def in enumerate(params_def): name = param_def.get('name') comment = param_def.get('comment') pvalue = params.get(name, None) if pvalue is not None: param_def['default'] = pvalue getter, setter, param_widget = self._factory.create(param_def) param_widget.grid(row=i + 1, column=1, padx=PADX_S, pady=PADY_S, sticky=W) param_label = Label(self._factory.container, text=f'{name}') param_label.grid(row=i + 1, column=0, padx=PADX_S, pady=PADY_S, sticky=W) param_descr = Label(self._factory.container, text=f'{comment}') param_descr.grid(row=i + 1, column=2, padx=PADX_S, pady=PADY_S, sticky=W) item_params_descr.append({ 'name': param_widget.winfo_name(), 'getter': getter, 'setter': setter, 'wd': param_widget }) return item_params_descr @staticmethod def _merge_curent_params_with_params_ws( item: FlowItemModel) -> Tuple[Dict, Dict]: # merge curent params with params_ws params = item.params # Dict params_ws = item.params_ws # Dict params_def = item.params_def # List[Dict] for k in params_ws.keys(): if k in params: continue params[k] = params_ws.ket(k) return params, params_def def set_active_wd(self, idx: int) -> None: self._hightlighte_active_wd() if self._active_wd_idx > idx: # disable, when move backward self._set_active_wd_state() self._active_wd_idx = idx self._hightlighte_active_wd(True) self._set_active_wd_state(True) self._set_button_io_state(idx) return def _set_active_wd_state(self, active: bool = False) -> None: state = DISABLED if active: state = NORMAL descriptors = self._grid_rows_descr[self._active_wd_idx] for descr in descriptors: widget = descr.get('wd') widget['state'] = state return def _disable_all(self) -> None: for descriptors in self._grid_rows_descr: for descr in descriptors: widget = descr.get('wd') widget['state'] = DISABLED return # UI methods def _hightlighte_active_wd(self, active: bool = False) -> None: fg_color = 'black' bg_color = 'SystemButtonFace' if active: fg_color = 'white' bg_color = 'RoyalBlue' descriptors = self._grid_rows_descr[self._active_wd_idx] for descr in descriptors: widget = descr.get('wd') name = widget.winfo_name() if name.startswith('--'): widget['fg'] = fg_color widget['bg'] = bg_color break return def _activate_params_buttons(self, activate=False) -> None: state = DISABLED if activate: state = NORMAL self.btn_params_reset['state'] = state self.btn_params_default['state'] = state self.btn_params_io['state'] = state return def _set_button_io_state(self, idx: int) -> None: flow_item = self._flow.get_item(idx) params_def = flow_item.params_def self.btn_params_io['state'] = DISABLED for param_def in params_def: if param_def.get('name') == 'path': self.btn_params_io['state'] = NORMAL break return