def Tabella(master): if len(GLOBE.titolo) == 0: return righe = len(list(GLOBE.titolo.keys())) colonne = len(list(GLOBE.titolo.get(list(GLOBE.titolo.keys())[0]).keys())) - 1 tabella = Sheet(master, data = [[f"Row {r}, Column {c}" for c in range(colonne)] for r in range(righe)], height = 400, width = 1550) tabella.headers((f"Header{c}" for c in range(colonne))) key_titolo = list(GLOBE.titolo.keys()) key_isin = GLOBE.titolo.get(key_titolo[0]).keys() header = list(key_isin) index = 0 for i in header: #mi crea gli header della tabella tabella.headers(i.capitalize(), index) # tabella.column_width(column = index, width = 150) index = index + 1 if index == colonne: break for j in range(len(key_titolo)): #mi riempe le celle della tabella for k in range(len(header) - 1): tabella.set_cell_data(j, k, value = GLOBE.titolo.get(key_titolo[j]).get(header[k])) tabella.set_all_cell_sizes_to_text() tabella.grid(row = 0, column = 0, sticky = "nswe")
class demo(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) self.frame = tk.Frame(self) self.frame.grid_columnconfigure(0, weight=1) self.frame.grid_rowconfigure(0, weight=1) self.sheet = Sheet( self.frame, #empty_vertical = 0, #empty_horizontal = 0, #show_vertical_grid = False, #show_horizontal_grid = False, #auto_resize_numerical_row_index = False, #header_height = "3", #row_index_width = 100, #align = "center", #header_align = "w", #row_index_align = "w", #theme = "green", data=[[ f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(30) ] for r in range(100)], #to set sheet data at startup #data = [[1,2,3,4,5], [1,2,3]], #headers = [f"Column {c}\nnewline1\nnewline2" for c in range(30)], #row_index = [f"Row {r}\nnewline1\nnewline2" for r in range(2000)], #set_all_heights_and_widths = True, #to fit all cell sizes to text at start up #headers = 0, #to set headers as first row at startup #headers = [f"Column {c}\nnewline1\nnewline2" for c in range(30)], theme="dark green", #header_background = "black", #row_index = 0, #to set row_index as first column at startup #total_rows = 2000, #if you want to set empty sheet dimensions at startup #total_columns = 30, #if you want to set empty sheet dimensions at startup height=500, #height and width arguments are optional width=1200 #For full startup arguments see DOCUMENTATION.md ) #self.sheet.hide("row_index") #self.sheet.hide("header") #self.sheet.hide("top_left") self.sheet.enable_bindings(( "single_select", #"single_select" or "toggle_select" "drag_select", #enables shift click selection as well "column_drag_and_drop", "row_drag_and_drop", "column_select", "row_select", "column_width_resize", "double_click_column_resize", #"row_width_resize", #"column_height_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row", "copy", "cut", "paste", "delete", "undo", "edit_cell")) #self.sheet.enable_bindings("enable_all") #self.sheet.disable_bindings() #uses the same strings #self.bind("<Configure>", self.window_resized) self.sheet.set_all_cell_sizes_to_text() self.frame.grid(row=0, column=0, sticky="nswe") self.sheet.grid(row=0, column=0, sticky="nswe") """_________________________ EXAMPLES _________________________ """ """_____________________________________________________________""" # __________ CHANGING THEME __________ #self.sheet.change_theme("dark") # __________ HIGHLIGHT / DEHIGHLIGHT CELLS __________ self.sheet.highlight_cells(row=5, column=5, bg="#ed4337", fg="white") self.sheet.highlight_cells(row=5, column=1, bg="#ed4337", fg="white") self.sheet.highlight_cells(row=5, bg="#ed4337", fg="white", canvas="row_index") self.sheet.highlight_cells(column=0, bg="#ed4337", fg="white", canvas="header") # __________ DISPLAY SUBSET OF COLUMNS __________ #self.sheet.display_subset_of_columns(indexes = [1, 0, 2], enable = True) #any order # __________ DATA AND DISPLAY DIMENSIONS __________ #self.sheet.total_rows(4) #will delete rows if set to less than current data rows #self.sheet.total_columns(2) #will delete columns if set to less than current data columns #self.sheet.sheet_data_dimensions(total_rows = 4, total_columns = 2) #self.sheet.sheet_display_dimensions(total_rows = 4, total_columns = 6) #currently resets widths and heights #self.sheet.set_sheet_data_and_display_dimensions(total_rows = 4, total_columns = 2) #currently resets widths and heights # __________ SETTING OR RESETTING TABLE DATA __________ #.set_sheet_data() function returns the object you use as argument #verify checks if your data is a list of lists, raises error if not #self.data = self.sheet.set_sheet_data([[f"Row {r} Column {c}" for c in range(30)] for r in range(2000)], verify = False) # __________ SETTING ROW HEIGHTS AND COLUMN WIDTHS __________ #self.sheet.set_cell_data(0, 0, "\n".join([f"Line {x}" for x in range(500)])) #self.sheet.set_column_data(1, ("" for i in range(2000))) #self.sheet.row_index((f"Row {r}" for r in range(2000))) #any iterable works #self.sheet.row_index("\n".join([f"Line {x}" for x in range(500)]), 2) #self.sheet.column_width(column = 0, width = 300) #self.sheet.row_height(row = 0, height = 60) #self.sheet.set_column_widths([120 for c in range(30)]) #self.sheet.set_row_heights([30 for r in range(2000)]) #self.sheet.set_all_column_widths() #self.sheet.set_all_row_heights() #self.sheet.set_all_cell_sizes_to_text() # __________ BINDING A FUNCTIONS TO USER ACTIONS __________ self.sheet.extra_bindings([ ("cell_select", self.cell_select), #("begin_edit_cell", self.begin_edit_cell), ("shift_cell_select", self.shift_select_cells), ("drag_select_cells", self.drag_select_cells), ("ctrl_a", self.ctrl_a), ("row_select", self.row_select), ("shift_row_select", self.shift_select_rows), ("drag_select_rows", self.drag_select_rows), ("column_select", self.column_select), ("shift_column_select", self.shift_select_columns), ("drag_select_columns", self.drag_select_columns), ("deselect", self.deselect) ]) #self.sheet.extra_bindings([("cell_select", None)]) #unbind cell select #self.sheet.extra_bindings("unbind_all") #remove all functions set by extra_bindings() # __________ BINDING NEW RIGHT CLICK FUNCTION __________ self.sheet.bind("<3>", self.rc) # __________ SETTING HEADERS __________ #self.sheet.headers((f"Header {c}" for c in range(30))) #any iterable works #self.sheet.headers("Change header example", 2) #print (self.sheet.headers()) #print (self.sheet.headers(index = 2)) # __________ SETTING ROW INDEX __________ #self.sheet.row_index((f"Row {r}" for r in range(2000))) #any iterable works #self.sheet.row_index("Change index example", 2) #print (self.sheet.row_index()) #print (self.sheet.row_index(index = 2)) # __________ INSERTING A ROW __________ #self.sheet.insert_row(values = (f"my new row here {c}" for c in range(30)), idx = 0) # a filled row at the start #self.sheet.insert_row() # an empty row at the end # __________ INSERTING A COLUMN __________ #self.sheet.insert_column(values = (f"my new col here {r}" for r in range(2050)), idx = 0) # a filled column at the start #self.sheet.insert_column() # an empty column at the end # __________ SETTING A COLUMNS DATA __________ # any iterable works #self.sheet.set_column_data(0, values = (0 for i in range(2050))) # __________ SETTING A ROWS DATA __________ # any iterable works #self.sheet.set_row_data(0, values = (0 for i in range(35))) # __________ SETTING A CELLS DATA __________ #self.sheet.set_cell_data(1, 2, "NEW VALUE") # __________ GETTING FULL SHEET DATA __________ #self.all_data = self.sheet.get_sheet_data() # __________ GETTING CELL DATA __________ #print (self.sheet.get_cell_data(0, 0)) # __________ GETTING ROW DATA __________ #print (self.sheet.get_row_data(0)) # only accessible by index # __________ GETTING COLUMN DATA __________ #print (self.sheet.get_column_data(0)) # only accessible by index # __________ GETTING SELECTED __________ #print (self.sheet.get_currently_selected()) #print (self.sheet.get_selected_cells()) #print (self.sheet.get_selected_rows()) #print (self.sheet.get_selected_columns()) #print (self.sheet.get_selection_boxes()) #print (self.sheet.get_selection_boxes_with_types()) # __________ SETTING SELECTED __________ #self.sheet.deselect("all") #self.sheet.create_selection_box(0, 0, 2, 2, type_ = "cells") #type here is "cells", "cols" or "rows" #self.sheet.set_currently_selected(0, 0) #self.sheet.set_currently_selected("row", 0) #self.sheet.set_currently_selected("column", 0) # __________ CHECKING SELECTED __________ #print (self.sheet.is_cell_selected(0, 0)) #print (self.sheet.is_row_selected(0)) #print (self.sheet.is_column_selected(0)) #print (self.sheet.anything_selected()) # __________ HIDING THE ROW INDEX AND HEADERS __________ #self.sheet.hide("row_index") #self.sheet.hide("top_left") #self.sheet.hide("header") # __________ ADDITIONAL BINDINGS __________ #self.sheet.bind("<Motion>", self.mouse_motion) """ UNTIL DOCUMENTATION IS COMPLETE, PLEASE BROWSE THE FILE _tksheet.py FOR A FULL LIST OF FUNCTIONS AND THEIR PARAMETERS """ def begin_edit_cell(self, event): pass def window_resized(self, event): pass #print (event) def mouse_motion(self, event): region = self.sheet.identify_region(event) row = self.sheet.identify_row(event, allow_end=False) column = self.sheet.identify_column(event, allow_end=False) print(region, row, column) def deselect(self, event): print(event, self.sheet.get_selected_cells()) def rc(self, event): print(event) def cell_select(self, response): #print (response) pass def shift_select_cells(self, response): print(response) def drag_select_cells(self, response): pass #print (response) def ctrl_a(self, response): print(response) def row_select(self, response): print(response) def shift_select_rows(self, response): print(response) def drag_select_rows(self, response): pass #print (response) def column_select(self, response): print(response) #for i in range(50): # self.sheet.create_dropdown(i, response[1], values=[f"{i}" for i in range(200)], set_value="100", # destroy_on_select = False, destroy_on_leave = False, see = False) #print (self.sheet.get_cell_data(0, 0)) #self.sheet.refresh() def shift_select_columns(self, response): print(response) def drag_select_columns(self, response): pass
class columnselection(tk.Frame): def __init__(self,parent,C): tk.Frame.__init__(self,parent) self.C = C self.parent_cols = [] self.rowlen = 0 self.grid_rowconfigure(0,weight=1) self.grid_rowconfigure(1,weight=1) self.grid_columnconfigure(1,weight=1) self.flattened_choices = flattened_base_ids_choices(self,command=self.flattened_mode_toggle) self.flattened_choices.grid(row=1,column=0,pady=(0,5),sticky="wnse") self.flattened_selector = flattened_column_selector(self) self.selector = id_and_parent_column_selector(self) self.selector.grid(row=1,column=0,sticky="wnse") self.sheetdisplay = Sheet(self, theme = self.C.theme, header_font = ("Calibri", 13, "normal"), outline_thickness=1) self.sheetdisplay.enable_bindings("enable_all") self.sheetdisplay.extra_bindings([("row_index_drag_drop", self.drag_row), ("column_header_drag_drop", self.drag_col), ("ctrl_x", self.reset_selectors), ("delete_key", self.reset_selectors), ("rc_delete_column", self.reset_selectors), ("rc_delete_row", self.reset_selectors), ("rc_insert_column", self.reset_selectors), ("rc_insert_row", self.reset_selectors), ("ctrl_v", self.reset_selectors), ("ctrl_z", self.reset_selectors), ("edit_cell", self.edit_cell_in_sheet) ]) self.sheetdisplay.grid(row=0,column=1,rowspan=3,sticky="nswe") self.cont_ = button(self, text="Build tree with selections ", style="TF.Std.TButton",command=self.try_to_build_tree) self.cont_.grid(row=2,column=0,sticky="wns",padx=10,pady=(10, 50)) self.cont_.config(width=40) self.flattened_selector.grid(row=0,column=0,pady=(0,9),sticky="nswe") self.selector.grid_forget() self.selector.grid(row=0,column=0,sticky="nswe") self.flattened_selector.grid_forget() def flattened_mode_toggle(self): x = self.flattened_choices.get_choices()[0] if x: self.flattened_selector.grid(row=0,column=0,pady=(0,9),sticky="nswe") self.selector.grid_forget() else: self.selector.grid(row=0,column=0,sticky="nswe") self.flattened_selector.grid_forget() def drag_col(self, event): colsiter = sorted(event[1]) c = event[3] stins = colsiter[0] endins = colsiter[-1] + 1 self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.selector.detect_id_col() self.selector.detect_par_cols() def drag_row(self, event): rowsiter = sorted(event[1]) r = event[3] stins = rowsiter[0] endins = rowsiter[-1] + 1 self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.selector.detect_id_col() self.selector.detect_par_cols() def reset_selectors(self, event = None): idcol = self.selector.get_id_col() parcols = self.selector.get_par_cols() ancparcols = self.flattened_selector.get_par_cols() self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]] if self.sheetdisplay.get_sheet_data() else []) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]] if self.sheetdisplay.get_sheet_data() else []) try: if idcol is not None and self.sheetdisplay.get_sheet_data(): self.selector.set_id_col(idcol) except: pass try: if parcols and self.sheetdisplay.get_sheet_data(): self.selector.set_par_cols(parcols) except: pass try: if ancparcols and self.sheetdisplay.get_sheet_data(): self.flattened_selector.set_par_cols(ancparcols) except: pass def edit_cell_in_sheet(self, event = None): idcol = self.selector.get_id_col() parcols = self.selector.get_par_cols() ancparcols = self.flattened_selector.get_par_cols() if event[1] == idcol or event[1] in parcols or event[1] in ancparcols or event[0] == 0: self.reset_selectors() def enable_widgets(self): self.selector.enable_me() self.flattened_selector.enable_me() self.flattened_choices.enable_me() self.cont_.config(state="normal") self.sheetdisplay.basic_bindings(True) self.sheetdisplay.enable_bindings("enable_all") self.sheetdisplay.extra_bindings([("row_index_drag_drop", self.drag_row), ("column_header_drag_drop", self.drag_col), ("ctrl_x", self.ctrl_x_in_sheet), ("delete_key", self.del_in_sheet), ("rc_delete_column", self.del_in_sheet), ("rc_delete_row", self.del_in_sheet), ("rc_insert_column", self.reset_selectors), ("rc_insert_row", self.reset_selectors), ("ctrl_v", self.ctrl_v_in_sheet), ("ctrl_z", self.ctrl_z_in_sheet), ("edit_cell", self.edit_cell_in_sheet) ]) def disable_widgets(self): self.selector.disable_me() self.flattened_selector.disable_me() self.flattened_choices.disable_me() self.cont_.config(state="disabled") self.sheetdisplay.basic_bindings(False) self.sheetdisplay.disable_bindings("disable_all") self.sheetdisplay.extra_bindings("unbind_all") self.sheetdisplay.unbind("<Delete>") def populate(self, columns, non_tsrgn_xl_file = False): self.sheetdisplay.deselect("all") self.non_tsrgn_xl_file = non_tsrgn_xl_file self.rowlen = len(columns) self.selector.set_columns([h for h in self.C.treeframe.sheet[0]]) self.flattened_selector.set_columns([h for h in self.C.treeframe.sheet[0]]) self.C.treeframe.sheet = self.sheetdisplay.set_sheet_data(data = self.C.treeframe.sheet, redraw=True) self.sheetdisplay.headers(newheaders=0) if len(self.C.treeframe.sheet) < 3000: self.sheetdisplay.set_all_cell_sizes_to_text() self.selector.detect_id_col() self.selector.detect_par_cols() self.flattened_selector.detect_par_cols() self.C.show_frame("columnselection") def try_to_build_tree(self): baseids, order, delcols = self.flattened_choices.get_choices() if baseids: hiers = list(self.flattened_selector.get_par_cols()) if len(hiers) < 2: return else: hiers = list(self.selector.get_par_cols()) if not hiers: return idcol = self.selector.get_id_col() if idcol in hiers or idcol is None: return self.C.status_bar.change_text("Loading... ") self.C.disable_at_start() self.C.treeframe.sheet = self.sheetdisplay.get_sheet_data() if baseids: if order == "Order: Base → Top": idcol = hiers.pop(0) elif order == "Order: Top → Base": idcol = hiers.pop(len(hiers) - 1) self.C.treeframe.sheet[:] = [row + list(repeat("",self.rowlen - len(row))) if len(row) < self.rowlen else row for row in self.C.treeframe.sheet] self.C.treeframe.sheet, self.rowlen, idcol, newpc = self.C.treeframe.treebuilder.convert_flattened_to_normal(data = self.C.treeframe.sheet, idcol = idcol, parcols = hiers, rowlen = self.rowlen, order = order, delcols = delcols, warnings = self.C.treeframe.warnings) hiers = [newpc] self.C.treeframe.headers = [Header(name) for name in self.C.treeframe.fix_heads(self.C.treeframe.sheet.pop(0),self.rowlen)] self.C.treeframe.ic = idcol self.C.treeframe.hiers = hiers self.C.treeframe.pc = hiers[0] self.C.treeframe.row_len = int(self.rowlen) self.C.treeframe.set_metadata(headers = True) self.C.treeframe.sheet, self.C.treeframe.nodes, self.C.treeframe.warnings = self.C.treeframe.treebuilder.build(self.C.treeframe.sheet, self.C.treeframe.new_sheet, self.C.treeframe.row_len, self.C.treeframe.ic, self.C.treeframe.hiers, self.C.treeframe.nodes, self.C.treeframe.warnings) self.C.treeframe.populate(non_tsrgn_xl_file = self.non_tsrgn_xl_file) self.C.treeframe.show_warnings(str(self.C.open_dict['filepath']),str(self.C.open_dict['sheet']))