def HeaderInfo(): window = tk.Toplevel(root) window.title("Header Information") window.resizable(True, True) header_info = Table(window, dataframe=df) header_info.autoResizeColumns() header_info.show()
class DataFrame(tk.Frame): label = "View Data" def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.columnconfigure(index=0, weight=1) self.rowconfigure(index=1, weight=1) self.create_widgets() def show(self): self.tkraise() def create_widgets(self): # Create buttons to manage the DB. self.toolbar = tk.Frame(self) self.toolbar.grid(row=0, column=0, padx=12, pady=3, sticky="NSEW") for col in range(12): self.toolbar.columnconfigure(index=col, weight=1) self.save_button = tk.Button( self.toolbar, text="Save Data To DB", command=self.save_to_db) self.export_button = tk.Button( self.toolbar, text="Export Data to File", command=self.export_data) self.import_button = tk.Button( self.toolbar, text="Import Data from CSV", command=self.import_csv) self.refresh_button = tk.Button( self.toolbar, text="Refresh Data from DB", command=self.refresh_table_data) self.save_button.grid(row=0, column=12) self.export_button.grid(row=0, column=11) self.import_button.grid(row=0, column=10) self.refresh_button.grid(row=0, column=9) self.table_container = tk.Frame(self) self.table_container.grid(row=1, column=0, sticky="NSEW") # Create table to display data data_df = DataStore.data self.data_table = Table(self.table_container, dataframe=data_df) self.data_table.autoResizeColumns() self.data_table.show() def refresh_table_data(self): res = tkMessageBox.askyesno(title="Are you sure you want to refresh the DB.", message="Are you sure that you want to refresh the DB.\n" "This will undo any changes that you made before saving your data. This includes CSV file that you have imported") if res == tkMessageBox.NO: return data_df = get_db_data() DataStore.data = data_df self.data_table.updateModel(TableModel(data_df)) self.data_table.redraw() def export_data(self): output_file = tkFileDialog.askopenfilename() if not output_file: tkMessageBox.showerror(title="Export Failed", message="Export failed as no file was selected.") return def save_to_db(self): add_df_to_db(DataStore.data) def import_csv(self): # Get file to import input_file = tkFileDialog.askopenfilename() if not input_file.strip(): tkMessageBox.showerror(title="Import Failed", message="Import failed as no file was selected.") return try: import_df = pd.read_csv(input_file) except ParserError: tkMessageBox.showerror( "The supplied file is not a valid CSV file, could not import.") if len(import_df) > 0: # Data was loaded. DataStore.data.reset_index(level=["id_product"], inplace=True) table_df = DataStore.data.append(import_df, ignore_index=False) table_df.set_index("id_product", inplace=True) DataStore.data = table_df self.data_table.updateModel(TableModel(table_df)) self.data_table.redraw() tkMessageBox.showinfo(title="Import Successful", message="Import Completed Successfully!") else: tkMessageBox.showinfo(title="Import Failed", message="Input file did not have any CSV data so no data was added.")
def run_algo(): print("run") global node_file, edge_file node_file = pd.read_csv(ent_node_loc.get()) edge_file = pd.read_csv(ent_edge_loc.get()) sample_size = int(ent_sample_size.get()) / 100 adjacency_list = fileProcessor(edge_file, node_file) edge_list = adjtoedgelist(adjacency_list) global n n = len(adjacency_list) m = len(edge_list) print("Original Graph") print("len of al = ", n) print("len of el = ", m) rnAdj, rnEdge = randomNode(adjacency_list, sample_size) reAdj, reEdge = randomEdge(edge_list, sample_size) rwAdj, rwEdge = randomWalk(adjacency_list, sample_size) org = dig(adjacency_list) re = dig(reAdj) rn = dig(rnAdj) rw = dig(rwAdj) frm_dist = tk.Frame(frm_preview) frm_dist.pack(expand=tk.TRUE, fill=tk.BOTH) dist.clear() canvas = FigureCanvasTkAgg(fig, frm_dist) dist.plot(list(org.keys()), list(org.values()), label='Original Graph') dist.plot(list(rn.keys()), list(rn.values()), label="Random Node") dist.plot(list(re.keys()), list(re.values()), label="Random Edge") dist.plot(list(rw.keys()), list(rw.values()), label="Random Walk") dist.set_title("Smaple size : " + str(sample_size)) dist.set_xlabel("Degree") dist.set_ylabel("Number of nodes") fig.legend(loc='upper right') canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, expand=tk.TRUE, fill=tk.BOTH) toolbar = NavigationToolbar2Tk(canvas, frm_dist) toolbar.update() canvas._tkcanvas.pack(side=tk.TOP, expand=tk.TRUE, fill=tk.BOTH) ## Generating reports g = {} # algorithms = ["Original graph","Random Node", "Random Edge", "Random Walk"] g["Original graph"] = (adjacency_list, edge_list) g["Random Node"] = (rnAdj, rnEdge) g["Random Edge"] = (reAdj, reEdge) g["Random Walk"] = (rwAdj, rwEdge) total_node = {} total_edge = {} max_degree = {} min_degree = {} avg_degree = {} for gr in g: adj, edge = g[gr] total_node[gr] = len(adj) total_edge[gr] = len(edge) d = cal_degree(adj) max_degree[gr] = max(d.values()) min_degree[gr] = min(d.values()) avg_degree[gr] = sum(list(d.values())) / len(d.values()) # print("d : ", d) # print("avg_degree ", gr, " : ", avg_degree[gr]) # print(gr, " -- ", len(adj), " -- ", len(edge)) report["Total Nodes"] = report['Algorithm'].map(total_node) report["Total Edges"] = report['Algorithm'].map(total_edge) report["Average_Degree"] = report['Algorithm'].map(avg_degree) report["Maximum_Degree"] = report['Algorithm'].map(max_degree) report["Minimum_Degree"] = report['Algorithm'].map(min_degree) lbl_res = tk.LabelFrame(frm_result, text="Result") lbl_res.pack(expand=tk.TRUE, fill=tk.BOTH) pt = Table(lbl_res, dataframe=report) pt.show() pt.autoResizeColumns() pt.redraw()
class RebalancingApp(Frame): def __init__(self, parent=None): self.parent = parent self.df = pd.DataFrame() self.new_df = pd.DataFrame() self.tickers = pd.DataFrame() super().__init__() self.invested_value = StringVar(value="0") self.add_invest_value = StringVar(value="0") # Create Main Window self.main = self.master self.main.title("Rabalancing Stocks") self.main.geometry("1024x768+100+100") self.top_frame = Frame(self.main) self.top_frame.pack(side ='top') # Menu Creation # File Menu self.menu = Menu(self.main) self.menu_file = Menu(self.menu, tearoff=0, font="* 12") # Default menu disable since there is no user data self.menu_file.add_command(label="Update Market Values", command=self.update_data, state="disable") self.menu_file.add_separator() self.menu_file.add_command(label="Load User Data", command=self.load_user_data) self.menu_file.add_separator() # self.menu_file.add_command(label="Save to Excel", state="disable") # self.menu_file.add_separator() self.menu_file.add_command(label="Exit", command=self.quit) self.menu.add_cascade(label="File", menu=self.menu_file) # Strategies Menu self.s_var = IntVar(value=0) self.menu_strategies = Menu(self.menu, tearoff=0, font="* 12") self.menu_strategies.add_radiobutton(label="Equal weight", variable=self.s_var, value=1) self.menu_strategies.add_radiobutton(label="Market Cap", variable=self.s_var, value=2) # self.menu_strategies.add_radiobutton(label="P/E Ratio", variable=self.s_var, value=3) # Default Strategies menu disable since there is no data to calculate self.menu.add_cascade(label="Strategies", menu=self.menu_strategies, state="disable") # Button to print out Strategies data self.invested_label_name = Label(self.top_frame, bg='#76EE00', font="* 20", text="Invesed Money($): ") self.invested_label_name.grid(row=0, column=0, padx=1, pady=1) self.invested_label = Label(self.top_frame, bg='#FFF8DC', font="* 20", width = 13, textvariable=self.invested_value) self.invested_label.grid(row=0, column=1, padx=1, pady=1) self.add_invest_name = Label(self.top_frame, bg='#76EE00', font="* 20", text="Extra Money($): ") self.add_invest_name.grid(row=0, column=2, padx=1, pady=1) self.add_invest_amount = Entry(self.top_frame, bg='#FFF8DC', font="* 20", width = 13, textvariable=self.add_invest_value) self.add_invest_amount.grid(row=0, column=3, padx=1, pady=1) self.button_rebalancing = Button(self.top_frame, text='Rebalancing', font="* 15", command=self.rebalancing, state="disable") self.button_rebalancing.grid(row=0, column=4, padx=0, pady=0) # Add menu bar to main Window self.main.config(menu=self.menu) # Display Frame to top at Window self.display = Frame(self.main) self.display.pack(padx=1, pady=1, fill=BOTH, side='top', expand=1) # Display Progressbar to bottom at Window self.p_var = DoubleVar() self.progressbar = ttk.Progressbar(self.main, maximum=100, variable=self.p_var) self.progressbar.pack(padx=1, pady=1, side='bottom', fill='x') # Functions # Window X Button overide # def on_closing(): # if messagebox.askokcancel("Quit", "Do you want to quit?"): # root.destroy() def quit(self): if messagebox.askyesno("Exit","Do you want to quit the application?"): self.main.quit() def rebalancing(self): if self.s_var.get() == 0: messagebox.showerror("Error","Please, select your strategy!") elif self.s_var.get() == 1: self.equal_rebalancing() elif self.s_var.get() == 2: self.market_cap_rebalancing() # elif self.s_var.get() == 3: # self.pe_ratio_rebalancing() else: messagebox.showerror("Critical","Something wrong!!!!!!!!") # Rabalancing Functions def invest_amount_calculation(self): # I have to fix when user input text instead intgeter. if self.add_invest_value.get() == "0": self.invest_amount = self.invested_temp_sum else: self.invest_amount = int(self.invested_temp_sum) + int(self.add_invest_amount.get()) def equal_rebalancing(self): self.invest_amount_calculation() self.equal_df = pd.DataFrame() number_of_stocks = len(self.new_df.index) invest_amount_per_stock = self.invest_amount/number_of_stocks for i, price in enumerate(self.new_df['Current Price']): temp_series = pd.Series([invest_amount_per_stock/price], index=['Equal Rebalance']) temp_series = self.new_df.iloc[i].append(temp_series) self.equal_df = self.equal_df.append(temp_series, ignore_index=True) self.equal_df = self.equal_df[['Symbol', 'Description', 'Sector', 'Quantity', 'Equal Rebalance', 'Cost Basis Per Share', 'Market Cap', 'Current Price', 'P/E Ratio(PER)', 'P/B Ratio(PBR)']] # self.pt.clearData() self.pt = Table(self.display, dataframe=self.equal_df, showtoolbar=False, showstatusbar=False, editable=False, enable_menus=False) options = config.load_options() options = {'rowselectedcolor':None} config.apply_options(options, self.pt) self.pt.show() # Add color to indicate 'add' or 'sub' quantity to user. Green color for add. Red color for Sub. add_mask = self.equal_df['Quantity'] < self.equal_df['Equal Rebalance'] self.pt.setColorByMask('Equal Rebalance', add_mask, '#7FFF00') sub_mask = self.equal_df['Quantity'] > self.equal_df['Equal Rebalance'] self.pt.setColorByMask('Equal Rebalance', sub_mask, '#FF6EB4') # self.pt.redraw() self.pt.autoResizeColumns() def market_cap_rebalancing(self): self.invest_amount_calculation() self.cap_df = pd.DataFrame() total_market_cap = self.new_df['Market Cap'].sum() for i, cap in enumerate(self.new_df['Market Cap']): temp_series = pd.Series([self.invest_amount*cap/total_market_cap/self.new_df['Current Price'][i]], index=['Cap Rebalance']) temp_series = self.new_df.iloc[i].append(temp_series) self.cap_df = self.cap_df.append(temp_series, ignore_index=True) self.cap_df = self.cap_df[['Symbol', 'Description', 'Sector', 'Quantity', 'Cap Rebalance', 'Cost Basis Per Share', 'Market Cap', 'Current Price', 'P/E Ratio(PER)', 'P/B Ratio(PBR)']] self.pt = Table(self.display, dataframe=self.cap_df, showtoolbar=False, showstatusbar=False, editable=False, enable_menus=False) options = config.load_options() options = {'rowselectedcolor':None} config.apply_options(options, self.pt) self.pt.show() # Add color to indicate 'add' or 'sub' quantity to user. Green color for add. Red color for Sub. add_mask = self.cap_df['Quantity'] < self.cap_df['Cap Rebalance'] self.pt.setColorByMask('Cap Rebalance', add_mask, '#7FFF00') sub_mask = self.cap_df['Quantity'] > self.cap_df['Cap Rebalance'] self.pt.setColorByMask('Cap Rebalance', sub_mask, '#FF6EB4') # print(total_market_cap) self.pt.autoResizeColumns() # def pe_ratio_rebalancing(self): # print('P/E Ratio') def load_market_data(self): self.tickers = tickers_sp500(True) # self.tickers.set_index('Symbol', inplace=True) def load_user_data(self): _file = filedialog.askopenfilename(title="Choose csv file...", \ filetypes=(("csv", "*.csv"),("All", "*.*")), initialdir=r"C:\Users\baekh\OneDrive\Desktop\Python") try: self.df = pd.read_csv(_file, index_col=False) self.df = self.df.drop(columns=['Account Name/Number']) self.df = self.df.rename(columns={"Current Value":"Current Price"}) # Keep only first row if there is duplications # self.df.drop_duplicates(subset=['Symbol'], inplace=True) # self.df = self.df.head() self.pt = Table(self.display, dataframe=self.df, showtoolbar=False, showstatusbar=False, editable=False, enable_menus=False) options = config.load_options() options = {'rowselectedcolor':None} config.apply_options(options, self.pt) self.pt.show() self.pt.autoResizeColumns() # self.pt.redraw() # Update Menu status self.menu_file.entryconfig("Update Market Values", state="normal") except: pass def update_data(self): self.load_market_data() for i, symbol in enumerate(self.df['Symbol']): # Variable for display status of Progressive Bar self.p_var.set(100/len(self.df.index)*(i+1)) self.progressbar.update() if symbol in self.tickers['Symbol'].values: # Loading live market data from yahoo finance data_from_yahoo = get_quote_data(symbol) # print(data_from_yahoo.keys()) temp = pd.Series( {'Symbol': symbol, 'Description': self.tickers.loc[self.tickers['Symbol'] == symbol]['Security'].item().strip(), 'Sector': self.tickers.loc[self.tickers['Symbol'] == symbol]['GICS Sector'].item().strip(), 'Cost Basis Per Share': self.df.loc[self.df['Symbol'] == symbol]['Cost Basis Per Share'].item().strip(), 'Quantity': self.df.loc[self.df['Symbol'] == symbol]['Quantity'].item(), 'Market Cap': data_from_yahoo['marketCap'], 'Current Price': data_from_yahoo['regularMarketPrice'], 'P/E Ratio(PER)': data_from_yahoo['trailingPE'] if 'trailingPE' in data_from_yahoo.keys() else None, 'P/B Ratio(PBR)': data_from_yahoo['priceToBook'] if 'priceToBook' in data_from_yahoo.keys() else None} ) self.new_df = self.new_df.append(temp, ignore_index=True) # print("Loading is completed") # Reorder Columns self.new_df = self.new_df[['Symbol', 'Description', 'Sector', 'Quantity', 'Cost Basis Per Share', 'Market Cap', 'Current Price', 'P/E Ratio(PER)', 'P/B Ratio(PBR)']] # first_column = self.new_df.pop('Symbol') # self.new_df.insert(0, 'Symbol', first_column) # self.pt.destroy() # self.pt.clearData() self.invested_temp_sum = 0 for i in range(len(self.new_df)): self.invested_temp_sum += self.new_df['Quantity'][i] * self.new_df['Current Price'][i] self.invested_temp_sum = round(self.invested_temp_sum, 3) self.invested_value.set(str(self.invested_temp_sum)) self.pt = Table(self.display, dataframe=self.new_df, showtoolbar=False, showstatusbar=False, editable=False, enable_menus=False) options = config.load_options() options = {'rowselectedcolor':None} config.apply_options(options, self.pt) self.pt.show() self.pt.autoResizeColumns() # self.pt.redraw() # Update menu status self.menu.entryconfig("Strategies", state="normal") # self.menu_file.entryconfig("Save to Excel", state="normal") self.button_rebalancing.config(state="normal")
class PageTwo(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.configure(background='#c2dfff') for i in range(9): self.columnconfigure(i, weight=200, minsize=1) self.rowconfigure(i, weight=200, minsize=1) start_page = Button(self, text=" בית", command=lambda: controller.show_frame(StartPage), font=('Arial', 14), bg='#c2dfff', relief="flat", activebackground="#F5F5DC", highlightbackground="Black", cursor="hand2").grid(row=1, column=0, columnspan=1, sticky=W) page_one = Button(self, text=" הוספת מטופל", command=lambda: controller.show_frame(PageOne), font=('Arial', 14), bg='#c2dfff', relief="flat", activebackground="#F5F5DC", highlightbackground="Black", cursor="hand2").grid(row=2, column=0, columnspan=1, sticky=W) page_three = Button(self, text=" פילוח מטופלים", command=lambda: controller.show_frame(PageThree), font=('Arial', 14), bg='#c2dfff', relief="flat", activebackground="#F5F5DC", highlightbackground="Black", cursor="hand2").grid(row=3, column=0, columnspan=1, sticky=W) self.controller = controller label = Label(self, text=":ביקורי המטופלים ", font=('Arial', 22, 'bold'), bg='#c2dfff') label.grid(row=0, column=4, columnspan=2) self.frame = Frame(self, relief=RAISED, borderwidth=1, bg='#F5F5DC') self.frame.grid( row=5, column=5, columnspan=6, ) # here we present the tables self.id_entry = StringVar() Label(self, text=":הכנס תעודת זהות", font=('Arial', 13), bg='#c2dfff').grid(row=2, column=5, columnspan=1, sticky=W) Entry(self, textvariable=self.id_entry, width="30").grid(row=2, column=4, sticky=E) Button(self, text='חפש מטופל', command=self.show_option).grid(row=2, column=3, sticky=E) Button(self, text="אפס", font=('Arial', 13), width="10", height="2", bg="grey", command=self.reset).grid(row=10, column=2, columnspan=1, sticky=E) self.new_dataframe_visits = visit_df.copy(deep=True) self.new_dataframe_visits.rename(columns={ 'id': 'ת.ז', 'visit_num': 'מספר ביקור', 'visit_date': 'תאריך ביקור', 'AH_regular': 'AH regular dose', 'AH_increase': 'AH increase', 'OMA_300': 'OMA 300', 'OMA_450': 'OMA 450', 'tiredness': 'עייפות', 'Breath_problems': 'קשיי נשימה', 'Swallowing_diff': 'קשיי בליעה', 'Abdominal_pain': 'כאבי בטן', 'attack_num': 'מספר התקף', 'IS_currently_active': 'האם בהתקף', 'Autopic_back': 'רקע אטופי', 'autoimmune_back': 'רקע אוטואימוני', 'disease_begin_date': 'תאריך תחילת מחלה' }, inplace=True) amudot = [ 'AH regular dose', 'AH increase', 'steroids', 'Cyclosporin', 'Singular', 'OMA 300', 'OMA 450', 'angioedma', 'Urticaria', 'עייפות', 'קשיי נשימה', 'קשיי בליעה', 'כאבי בטן', 'האם בהתקף', 'רקע אטופי', 'רקע אוטואימוני' ] for j in amudot: for index, row in self.new_dataframe_visits.iterrows(): if self.new_dataframe_visits[j][index] == 1: self.new_dataframe_visits[j][index] = 'Yes' elif self.new_dataframe_visits[j][index] == 0: self.new_dataframe_visits[j][index] = 'No' self.table_frame = Frame(self, relief=SUNKEN, borderwidth=2, bg='#F5F5DC') self.table_frame.grid(row=4, column=2, columnspan=12) self.pt = Table(self.table_frame, dataframe=self.new_dataframe_visits, height=350, width=1000) self.pt.autoResizeColumns() self.pt.show() def show_option(self): global visit_df self.new_dataframe_visits = visit_df.copy(deep=True) self.new_dataframe_visits.rename(columns={ 'id': 'ת.ז', 'visit_num': 'מספר ביקור', 'visit_date': 'תאריך ביקור', 'AH_regular': 'AH regular dose', 'AH_increase': 'AH increase', 'OMA_300': 'OMA 300', 'OMA_450': 'OMA 450', 'tiredness': 'עייפות', 'Breath_problems': 'קשיי נשימה', 'Swallowing_diff': 'קשיי בליעה', 'Abdominal_pain': 'כאבי בטן', 'attack_num': 'מספר התקף', 'IS_currently_active': 'האם בהתקף', 'Autopic_back': 'רקע אטופי', 'autoimmune_back': 'רקע אוטואימוני', 'disease_begin_date': 'תאריך תחילת מחלה' }, inplace=True) amudot = [ 'AH regular dose', 'AH increase', 'steroids', 'Cyclosporin', 'Singular', 'OMA 300', 'OMA 450', 'angioedma', 'Urticaria', 'עייפות', 'קשיי נשימה', 'קשיי בליעה', 'כאבי בטן', 'האם בהתקף', 'רקע אטופי', 'רקע אוטואימוני' ] for j in amudot: for index, row in self.new_dataframe_visits.iterrows(): if self.new_dataframe_visits[j][index] == 1: self.new_dataframe_visits[j][index] = 'Yes' elif self.new_dataframe_visits[j][index] == 0: self.new_dataframe_visits[j][index] = 'No' identifier = self.id_entry.get() # get option try: identifier = int(identifier) if (len(visit_df.loc[visit_df['id'] == identifier]) > 0): self.pt.close() self.pt = Table(self.table_frame, dataframe=self.new_dataframe_visits.loc[ visit_df.id == int(identifier)]) self.pt.show() else: tkm.showinfo("ID Not Found", "מטופל לא קיים במערכת") self.id_entry.set("") except: tkm.showinfo("ID Not Found", "מטופל לא קיים במערכת") self.id_entry.set("") def reset(self): self.id_entry.set("") self.pt.close() self.pt = Table(self.table_frame, dataframe=self.new_dataframe_visits) self.pt.show()
class DataFrame(tk.Frame): label = "Data" def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.columnconfigure(index=0, weight=1) self.rowconfigure(index=1, weight=1) self.create_widgets() def show(self): self.tkraise() def create_widgets(self): self.toolbar = tk.Frame(self) self.toolbar.grid(row=0, column=0, padx=12, pady=3, sticky="NSEW") for col in range(12): self.toolbar.columnconfigure(index=col, weight=1) self.save_button = tk.Button( self.toolbar, text="Store in vault", command=self.save_to_db) self.export_button = tk.Button( self.toolbar, text="Export File", command=self.export_data) self.import_button = tk.Button( self.toolbar, text="Import CSV", command=self.import_csv) self.refresh_button = tk.Button( self.toolbar, text="Refresh DB", command=self.refresh_table_data) self.save_button.grid(row=0, column=12) self.export_button.grid(row=0, column=11) self.import_button.grid(row=0, column=10) self.refresh_button.grid(row=0, column=9) self.table_container = tk.Frame(self) self.table_container = tk.Frame(self) self.table_container.grid(row=1, column=0, sticky="") data_df = Vault.data self.data_table = Table(self.table_container, dataframe=data_df) self.data_table.autoResizeColumns() self.data_table.show() def refresh_table_data(self): res = tkMessageBox.askyesno(title="Ready to reboot DB.", message="Ready to reboot DB.\n" "Undo") if res == tkMessageBox.NO: return data_df = get_db_data() Vault.data = data_df self.data_table.updateModel(TableModel(data_df)) self.data_table.redraw() def export_data(self): output_file = tkFileDialog.askopenfilename() if not output_file: tkMessageBox.showerror(title="Error, Failed!", message="...") return def save_to_db(self): add_df_to_db(Vault.data) def import_csv(self): input_file = tkFileDialog.askopenfilename() if not input_file.strip(): tkMessageBox.showerror(title="Error, Failed!", message="...") return try: import_df = pd.read_csv(input_file) except ParserError: tkMessageBox.showerror("Failed, Try again!.") if len(import_df) > 0: Vault.data.reset_index(level=["id_product"], inplace=True) table_df = Vault.data.append(import_df, ignore_index=False) table_df.set_index("id_product", inplace=True) Vault.data = table_df self.data_table.updateModel(TableModel(table_df)) self.data_table.redraw() tkMessageBox.showinfo(title="Done",message="Pass") else: tkMessageBox.showinfo(title="Error, Failed!", message="...")