def repeat_the_call(): settings = manage_db.fetch_all_from_table("settings")[0] pause = settings[10] timer = 3600000 # 1 hour in milliseconds if pause == "15min": timer = 900000 elif pause == "30min": timer = 1800000 elif pause == "1h": timer = 3600000 elif pause == "2h": timer = 7200000 manage_db.update_current_price() check_alarm_conditions(settings) self.after(timer, repeat_the_call)
def check_alarm_conditions(settings): """check if time and conditions to raise the alarm fit, if so, send message""" if manage_db.check_time(settings[8], settings[9]) == "alarm on": alarms = manage_db.fetch_all_from_table("alarms") for alarm in alarms: current_price = manage_db.fetch_current_price(alarm[0]).split()[0] if float(current_price) >= alarm[1]: if settings[0] == "1": send_message.send_sms(alarm[0], current_price, settings) if settings[1] == "1": send_message.send_email(alarm[0], current_price, settings) if settings[2] == "1": send_message.on_screen(alarm[0], current_price) if float(current_price) <= alarm[2]: if settings[0] == "1": send_message.send_sms(alarm[0], current_price, settings) if settings[1] == "1": send_message.send_email(alarm[0], current_price, settings) if settings[2] == "1": send_message.on_screen(alarm[0], current_price)
def populate_canvas(parent): """create scrollable canvas with child frame bind to it to display all the assets """ list_of_assets = manage_db.fetch_all_from_table("assets") added_values = calculate.add_liquid_assets() def menu_window(asset): def delete_asset(): manage_db.delete_row_from_table( "assets", "timestamp", asset[0]) choice_window.destroy() Assets.populate_canvas(parent) def edit_asset(): choice_window.destroy() def save(): new_asset = {"Currency": currency_spinbox.get(), "Amount": amount_entry.get(), "Note": note.get("1.0", "end-1c"), } if manage_db.check_for_real_numbers(new_asset["Amount"]): manage_db.add_asset(new_asset) manage_db.delete_row_from_table( "assets", "timestamp", asset[0]) top_window.destroy() Assets.populate_canvas(parent) top_window = tk.Toplevel(parent, height=350, width=390) top_window.title("Edit") little_frame = tk.Frame(top_window, height=50, width=200) little_frame.grid(sticky="nw") amount_label = tk.Label( little_frame, text="Amount: ", font=FONT) amount_label.grid(sticky="nw", padx=5, pady=5) amount_entry = tk.Entry(little_frame, width=10, font=FONT) amount_entry.grid(row=0, column=1, padx=5, pady=5) amount_entry.insert(0, asset[1]) currency_label = tk.Label( little_frame, text="Currency: ", font=FONT) currency_label.grid(sticky="nw", padx=5) currency_tuple = ("USD", "EUR", "GBP", "PLN", "CHF") currency_spinbox = tk.Spinbox( little_frame, values=currency_tuple, width=5, state="readonly", font=FONT) currency_spinbox.grid(row=1, column=1) currency_spinbox.insert(0, asset[2]) note = st.ScrolledText( top_window, width=30, height=5, font=FONT) note.grid(row=6, column=0, columnspan=3) note.insert(1.0, asset[3]) save_button = tk.Button( top_window, text="Edit", font=FONT, command=save) save_button.grid(sticky="nw", padx=5) choice_window = tk.Toplevel(master=None, width=400, height=200) edit_button = tk.Button( choice_window, text="Edit", font=FONT, bg="green", command=lambda: edit_asset()) edit_button.grid(row=0, column=0, pady=20, padx=20) delete_button = tk.Button( choice_window, text="Delete", font=FONT, bg="red", command=lambda: delete_asset()) delete_button.grid(row=0, column=1, pady=20) cancel_button = tk.Button( choice_window, text="Cancel", font=FONT, command=choice_window.destroy) cancel_button.grid(row=0, column=2, pady=20, padx=20) def on_frame_configure(canvas): '''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all")) def check_which_asset_you_clicked_on(event): if event.y < 80: pass else: asset_num = int((event.y-80)/80) menu_window(list_of_assets[asset_num]) canvas_scrollregion = 100*len(list_of_assets) canvas = tk.Canvas( parent, width=800, height=300, scrollregion=(0, 0, 0, canvas_scrollregion)) canvas.grid(row=1, column=0, sticky="w", rowspan=20) vbar = tk.Scrollbar( parent, orient=tk.VERTICAL, command=canvas.yview) vbar.grid(row=1, column=1, rowspan=20, sticky="ns") canvas.config(yscrollcommand=vbar.set) frame = tk.Frame( canvas, width=790, height=len(list_of_assets)*100) frame.grid(sticky="nw") frame.bind("<Configure>", lambda event, canvas=canvas: on_frame_configure(canvas)) canvas.create_window((0, 0), window=frame, anchor="nw") title_label = tk.Label(frame, text="SUMMARY:", font=BFONT) title_label.grid(row=0, column=0, sticky="w") eur_label = tk.Label(frame, text="EUR = " + str(added_values['eur']), font=BFONT) eur_label.grid(row=0, column=1, sticky="w") pln_label = tk.Label(frame, text="PLN = " + str(added_values['pln']), font=BFONT) pln_label.grid(row=1, column=1, sticky="w") gbp_label = tk.Label(frame, text="GBP = " + str(added_values['gbp']), font=BFONT) gbp_label.grid(row=0, column=2, sticky="w") usd_label = tk.Label(frame, text="USD = " + str(added_values['usd']), font=BFONT) usd_label.grid(row=1, column=2, sticky="w") chf_label = tk.Label(frame, text="CHF = " + str(added_values['chf']), font=BFONT) chf_label.grid(row=0, column=3, sticky="w") separator_label = tk.Label(frame, text="_"*300) separator_label.grid(sticky="nw", columnspan=15) row = 3 for asset in list_of_assets: cash_currency_string = (str(asset[1]) + " " + asset[2]) bils_label = tk.Label( frame, text=cash_currency_string, font=BFONT) bils_label.grid(row=row+1, column=0, sticky="w") description_label = tk.Label(frame, text=asset[3], font=BFONT) description_label.grid(sticky="nw", columnspan=15) separator_label = tk.Label(frame, text="_"*300) separator_label.grid(sticky="nw", columnspan=15) row += 3 frame.bind("<Button-3>", check_which_asset_you_clicked_on)
def curent_canvas(parent): """displays active (not sold) shares""" list_of_shares = manage_db.fetch_all_from_table("gpw_shares") top_seven_shares = calculate.seven_biggest_shares( calculate.shares_worth(list_of_shares)) total_worth = calculate.totaled_shares_worth() def on_frame_configure(canvas): '''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all")) def check_which_share_you_clicked_on(event): if event.y < 217: pass else: share_num = int((event.y - 217) / 217) add_edit_delete_share.menu_window(parent, list_of_shares[share_num]) canvas_scrollregion = 110 * len(list_of_shares) canvas = tk.Canvas(parent, width=800, height=300, scrollregion=(0, 0, 0, canvas_scrollregion)) canvas.grid(row=1, column=0, sticky="w", rowspan=20) vbar = tk.Scrollbar(parent, orient=tk.VERTICAL, command=canvas.yview) vbar.grid(row=1, column=1, rowspan=20, sticky="ns") canvas.config(yscrollcommand=vbar.set) frame = tk.Frame(canvas, width=805, height=len(list_of_shares) * 110) frame.grid(sticky="nw") frame.bind("<Configure>", lambda event, canvas=canvas: on_frame_configure(canvas)) canvas.create_window((0, 0), window=frame, anchor="nw") # SHARES PAGE, TOP OF SCROLABLE CANVAS, FIRST COLUMN (LABELS) title_label = tk.Label(frame, text="WALLET SUMMARY:", font=SFON) title_label.grid(sticky="nw") label = tk.Label(frame, text="TOP 7 SHARES:", font=SFON) label.grid(sticky="nw") counter = 1 for share in top_seven_shares: label = tk.Label(frame, text=share[0] + ':', font=SFON) label.grid(sticky="nw") counter += 1 while counter <= 7: label = tk.Label(frame, text=' ' * 5, font=SFON) label.grid(sticky="nw") counter += 1 # SHARES PAGE, TOP OF SCROLABLE CANVAS, SECOND COLUMN (WORTH) total_worth_label = tk.Label(frame, font=SFON, text="total worth: " + str(total_worth)) total_worth_label.grid(row=0, column=1, sticky="w") counter = 1 for share in top_seven_shares: label = tk.Label(frame, text="worth: " + str(share[1]), font=SFON) label.grid(row=counter + 1, column=1, sticky="w") counter += 1 while counter <= 7: label = tk.Label(frame, text=" " * 5, font=SFON) label.grid(row=counter + 1, column=1, sticky="w") counter += 1 # SHARES PAGE, TOP OF SCROLABLE CANVAS, THIRD COLUMN (PROFIT) total_profit_label = tk.Label(frame, font=SFON) total_profit_label.grid(row=0, column=2, sticky="w") profit_totaled = 0 for share in list_of_shares: profit_totaled += calculate.profit_per_share(share) profit_totaled = round(profit_totaled, 2) if profit_totaled > 0: total_profit_label.configure(fg="green", text="total profit: " + str(profit_totaled)) if profit_totaled < 0: total_profit_label.configure(fg="red", text="total profit: " + str(profit_totaled)) counter = 1 profit_per_packet = calculate.profit_per_packet(list_of_shares) for top in top_seven_shares: profit = round(profit_per_packet[top[0]], 2) label = tk.Label(frame, text="profit: " + str(profit), font=SFON) label.grid(row=counter + 1, column=2, sticky="w") counter += 1 while counter <= 7: label = tk.Label(frame, text=" " * 5, font=SFON) label.grid(row=counter + 1, column=2, sticky="w") counter += 1 # SHARES PAGE, TOP OF SCROLABLE CANVAS, 4 COLUMN (% OF WHOLE WALLET) counter = 1 for share in top_seven_shares: percentage = calculate.calculate_percentage(total_worth, share[1]) label = tk.Label(frame, text="% of wallet: " + str(percentage) + "%", font=SFON) label.grid(row=counter + 1, column=3, sticky="w") counter += 1 while counter <= 7: label = tk.Label(frame, text=" " * 5, font=SFON) label.grid(row=counter + 1, column=3, sticky="w") counter += 1 # separator note_label = tk.Label(frame, text="_" * 200) note_label.grid(sticky="nw", columnspan=15) row = 10 for share in list_of_shares: curent_price = manage_db.fetch_current_price(share[1]) # TITLE LABELS: list_of_labels = [ "NAME:", "QUANTITY:", "PRICE PER S.:", "ENTRY DATE:", "CURRENT PRICE:", "COSTS:", "DIVIDENDS:", "ANNUAL RoR:", "PROFIT:" ] for txt in list_of_labels: label = tk.Label(frame, text=txt, font=SFON) label.grid(sticky="nw") # VALUES curent_val_per_s = float(curent_price.split(" ")[0]) total_buying_price = share[2] * share[3] total_selling_price = share[2] * curent_val_per_s total_div = calculate.total_dividend(share[8]) total_costs = calculate.total_costs(total_buying_price, total_selling_price) annual_ror = calculate.annual_ror(share, curent_val_per_s, total_costs, total_div) profit = (total_selling_price - total_buying_price + total_div - total_costs) label = tk.Label(frame, text=share[1], font=SFON) label.grid(row=row + 0, column=1, sticky="w") label = tk.Label(frame, text=share[2], font=SFON) label.grid(row=row + 1, column=1, sticky="w") label = tk.Label(frame, text=share[3], font=SFON) label.grid(row=row + 2, column=1, sticky="w") label = tk.Label(frame, text=share[4], font=SFON) label.grid(row=row + 3, column=1, sticky="w") label = tk.Label(frame, text=curent_price.split(" ")[0], font=SFON) label.grid(row=row + 4, column=1, sticky="w") label = tk.Label(frame, text=curent_price.split(" ")[1], font="Calabria 8") label.grid(row=row + 4, column=2, sticky="w") percent_change = float(curent_price.split(" ")[1].strip("%")) if percent_change > 0: label.configure(fg="green") if percent_change < 0: label.configure(fg="red") val_change = curent_price.split(" ")[2] label = tk.Label(frame, text=val_change, font="Calabria 8") label.grid(row=row + 4, column=3, sticky="w") if float(val_change) > 0: label.configure(fg="green") if float(val_change) < 0: label.configure(fg="red") time = (curent_price.split(" ")[3] + " " + curent_price.split(" ")[4]) label = tk.Label(frame, text=time, font="Calabria 8") label.grid(row=row + 4, column=4, sticky="w") label = tk.Label(frame, text=round(total_costs, 2), font=SFON) label.grid(row=row + 5, column=1, sticky="w") label = tk.Label(frame, text=total_div, font=SFON) label.grid(row=row + 6, column=1, sticky="w") label = tk.Label(frame, text=str(annual_ror) + "%", font=SFON) label.grid(row=row + 7, column=1, sticky="w") label = tk.Label(frame, text=round(profit, 2), font=SFON) if profit > 0: label.configure(fg="green") if profit < 0: label.configure(fg="red") label.grid(row=row + 8, column=1, sticky="w") row += 10 # separator note_label = tk.Label(frame, text="_" * 200) note_label.grid(sticky="nw", columnspan=15) frame.bind("<Button-3>", check_which_share_you_clicked_on)
def populate_frame(parent): """display current settings""" if manage_db.fetch_all_from_table('settings'): # if len(manage_db.fetch_all_from_table('settings')) == 0: settings_dict = { "sms": '0', "mail": '0', "screen": '0', "id": "", "api": "", "p_number": "", "email": "", "from": "09:00", "to": "17:00", "break": "30min", "email_pass": "" } manage_db.add_settings(settings_dict) current_settings = manage_db.fetch_all_from_table('settings')[0] else: current_settings = manage_db.fetch_all_from_table('settings')[0] def save(): """save settings""" settings_dict = { "sms": str(sms_var.get()), "mail": str(email_var.get()), "screen": str(screen_var.get()), "id": id_entry.get(), "api": api_entry.get(), "p_number": number_entry.get(), "email": email_entry.get(), "from": from_time.get(), "to": to_time.get(), "break": break_time.get() } if email_pass.get().rstrip("*"): settings_dict["email_pass"] = email_pass.get() else: settings_dict["email_pass"] = current_settings[7] manage_db.delete_row_from_table('settings', 'sms', current_settings[0]) manage_db.add_settings(settings_dict) Settings.populate_frame(parent) frame = tk.Frame(parent, width=800, height=300) frame.grid(row=1, column=0, sticky="w", rowspan=20) save_changes = tk.Button(frame, text="Save", font=FONT, command=save) save_changes.grid(row=8, column=2, sticky="e", padx=10) label = tk.Label(frame, text="customer id:", font=FONT) label.grid(row=1, column=0, sticky="w") label = tk.Label(frame, text="api key:", font=FONT) label.grid(row=2, column=0, sticky="w") label = tk.Label(frame, text=" " * 30, font=FONT) label.grid(row=2, column=2, sticky="w") label = tk.Label(frame, text="phone number: +", font=FONT) label.grid(row=3, column=0, sticky="w") label = tk.Label(frame, text="email:", font=FONT) label.grid(row=4, column=0, sticky="w") label = tk.Label(frame, text="password:"******"message time:", font=FONT) label.grid(row=5, column=0, sticky="w") label = tk.Label(frame, text="from:", font=FONT) label.grid(row=6, column=0, sticky="e") label = tk.Label(frame, text="to:", font=FONT) label.grid(row=7, column=0, sticky="e") label = tk.Label(frame, text="send every:", font=FONT) label.grid(row=8, column=0, sticky="ne") sms_var = tk.IntVar() def disable_widgets(): """unables to make changes in the inputed 'api_entry' and 'id_entry' widgets to avoid erasing input, widgets will respond after unlocking them with 'sms_button' checkbutton""" if sms_var.get() == 0: id_entry.configure(state=tk.DISABLED) api_entry.configure(state=tk.DISABLED) number_entry.configure(state=tk.DISABLED) else: id_entry.configure(state=tk.NORMAL) api_entry.configure(state=tk.NORMAL) number_entry.configure(state=tk.NORMAL) sms_button = tk.Checkbutton(frame, text="SMS", variable=sms_var, onvalue=1, offvalue=0, height=5, width=20, command=disable_widgets, pady=1, padx=1) sms_button.grid(row=0, column=1, sticky="w") id_entry = tk.Entry(frame, width=40, font=FONT) id_entry.grid(row=1, column=1, sticky="nw") api_entry = tk.Entry(frame, width=60, font=FONT) api_entry.grid(row=2, column=1, sticky="nw") number_entry = tk.Entry(frame, width=12, font=FONT) number_entry.grid(row=3, column=1, sticky="nw") email_var = tk.IntVar() def disable_widgets_2(): """unables to make changes in the inputed 'email_entry' and 'email_pass' widgets to avoid erasing input, widgets will respond after unlocking them with 'email_button' checkbutton""" if email_var.get() == 0: email_entry.configure(state=tk.DISABLED) email_pass.configure(state=tk.DISABLED) else: email_entry.configure(state=tk.NORMAL) email_pass.configure(state=tk.NORMAL) email_button = tk.Checkbutton(frame, text="EMAIL", variable=email_var, onvalue=1, offvalue=0, height=5, width=20, command=disable_widgets_2) email_button.grid(row=0, column=1) email_entry = tk.Entry(frame, width=20, font=FONT) email_entry.grid(row=4, column=1, sticky="nw") email_pass = tk.Entry(frame, width=20, font=FONT) email_pass.grid(row=4, column=1, sticky="ne") screen_var = tk.IntVar() on_screen_button = tk.Checkbutton(frame, text="ON SCREEN NOTIFICATION", variable=screen_var, onvalue=1, offvalue=0, height=5, width=20) on_screen_button.grid(row=0, column=1, sticky="e") from_time_tuple = (current_settings[8], "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00", "24:00") to_time_tuple = (current_settings[9], "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00", "24:00") break_tuple = (current_settings[10], "15min", "30min", "1h", "2h") from_time = tk.Spinbox(frame, values=from_time_tuple, width=5) from_time.grid(row=6, column=1, sticky="nw") to_time = tk.Spinbox(frame, values=to_time_tuple, width=5) to_time.grid(row=7, column=1, sticky="nw") break_time = tk.Spinbox(frame, values=break_tuple, width=6) break_time.grid(row=8, column=1, sticky="nw") sms_var.set(int(current_settings[0])) email_var.set(int(current_settings[1])) screen_var.set(int(current_settings[2])) id_entry.insert(0, current_settings[3]) api_entry.insert(0, current_settings[4]) number_entry.insert(0, current_settings[5]) email_entry.insert(0, current_settings[6]) email_pass.insert(0, "*" * len(current_settings[7])) id_entry.configure(state=tk.DISABLED) api_entry.configure(state=tk.DISABLED) number_entry.configure(state=tk.DISABLED) email_entry.configure(state=tk.DISABLED) email_pass.configure(state=tk.DISABLED)
def populate_canvas(parent): """create a scrollable canvas with frame binded to it""" list_of_reports = list() for profile in manage_db.fetch_all_from_table("current_price"): prof = manage_db.fetch_reports(profile[0]) if prof: list_of_reports.append(prof) def choose_action(event): """""" def delete_asset(to_delete): manage_db.delete_row_from_table("reports", "profile", to_delete[0][0]) choice_window.destroy() Watched.populate_canvas(parent) def set_alarm(share): prof = share[0][0] alarm = manage_db.fetch_alarm(prof) choice_window.destroy() def save(): high = high_price_entry.get() low = low_price_entry.get() if (manage_db.check_for_real_numbers(high) and manage_db.check_for_real_numbers(low)): manage_db.add_alarm(prof, high, low) Watched.populate_canvas(parent) top_window.destroy() top_window = tk.Toplevel(parent, height=350, width=390) top_window.title("Edit") amount_label = tk.Label(top_window, text=prof, font=FONT) amount_label.grid(sticky="nw", padx=5, pady=5) amount_label = tk.Label(top_window, text="Let me know when:", font=FONT) amount_label.grid(sticky="nw", padx=5, pady=5) label = tk.Label(top_window, text="Price is higher or equal to:", font=FONT) label.grid(sticky="nw", padx=5, pady=5) label = tk.Label(top_window, text="Price is lower or equal to:", font=FONT) label.grid(sticky="nw", padx=5, pady=5) high_price_entry = tk.Entry(top_window, width=10, font=FONT) high_price_entry.grid(row=2, column=1, padx=5, pady=5) low_price_entry = tk.Entry(top_window, width=10, font=FONT) low_price_entry.grid(row=3, column=1, padx=5, pady=5) high_price_entry.insert(0, alarm[1]) low_price_entry.insert(0, alarm[2]) add_button = tk.Button(top_window, text="Add", font=FONT, command=save) add_button.grid(sticky="nw", padx=5) asset_num = int(event.y / 196) choice_window = tk.Toplevel(master=None, width=400, height=200) alarm_button = tk.Button( choice_window, text="Add alarm", font=FONT, bg="green", command=lambda: set_alarm(list_of_reports[asset_num])) alarm_button.grid(row=0, column=0, pady=20, padx=20) delete_button = tk.Button( choice_window, text="Delete", font=FONT, bg="red", command=lambda: delete_asset(list_of_reports[asset_num])) delete_button.grid(row=0, column=1, pady=20) cancel_button = tk.Button(choice_window, text="Cancel", font=FONT, command=choice_window.destroy) cancel_button.grid(row=0, column=2, pady=20, padx=20) def on_frame_configure(canvas): '''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all")) canvas_scrollregion = 100 * len(list_of_reports) canvas = tk.Canvas(parent, width=800, height=300, scrollregion=(0, 0, 0, canvas_scrollregion)) canvas.grid(row=1, column=0, sticky="w", rowspan=20) vbar = tk.Scrollbar(parent, orient=tk.VERTICAL, command=canvas.yview) vbar.grid(row=1, column=1, rowspan=20, sticky="ns") canvas.config(yscrollcommand=vbar.set) frame = tk.Frame(canvas, width=705, height=len(list_of_reports) * 100) frame.grid(sticky="nw") frame.bind("<Configure>", lambda event, canvas=canvas: on_frame_configure(canvas)) canvas.create_window((0, 0), window=frame, anchor="nw") row = 0 for report in list_of_reports: current_price = manage_db.fetch_current_price(report[0][0]) # first column rows = 0 list_of_labels = [ report[0][0], " ", "Av. Price:", "BV/Share:", "Price/BV:", "Net Profit(k):", "Shares(k):", "NMP:" ] for txt in list_of_labels: label = tk.Label(frame, text=txt, font=SFON) label.grid(row=0 + rows + row, column=0, sticky="w") rows += 1 # first row price_label = tk.Label(frame, text=current_price.split(" ")[0], font=SFON) price_val_label = tk.Label(frame, text=current_price.split(" ")[1], font=SFON) price_prc_label = tk.Label(frame, text=current_price.split(" ")[2], font=SFON) if float(current_price.split(" ")[2]) > 0: price_val_label.configure(fg="green") price_prc_label.configure(fg="green") elif float(current_price.split(" ")[2]) < 0: price_val_label.configure(fg="red") price_prc_label.configure(fg="red") list_of_labels = [price_label, price_val_label, price_prc_label] col = 1 for label in list_of_labels: label.grid(row=0 + row, column=col, sticky='w') col += 1 label = tk.Label(frame, text="P/BV:", font=SFON) label.grid(row=0 + row, column=4, sticky="w") current_price_per_bv = (float(current_price.split(" ")[0]) / ( (float(report[4][9]) * 1000) / int(report[5][9]))) label = tk.Label(frame, text=round(current_price_per_bv, 2), font=SFON) label.grid(row=0 + row, column=5, sticky="w") for i in range(2, 10): # second row label = tk.Label(frame, text=report[0][i], font=SFON) label.grid(row=1 + row, column=i - 1, sticky="w") # third row (quartal average share price) label = tk.Label(frame, text=round(float(report[1][i]), 2), font=SFON) label.grid(row=2 + row, column=i - 1, sticky="w") # 4th row (BV/Share - book_value/share_numbers) bv_per_share = (float(report[4][i]) * 1000) / int(report[5][i]) label = tk.Label(frame, text=round(bv_per_share, 2), font=SFON) label.grid(row=3 + row, column=i - 1, sticky="w") # 5th row (P/BV - price/(book_value/shares_number)) price_per_bv = (float(report[1][i]) / ( (float(report[4][i]) * 1000) / int(report[5][i]))) label = tk.Label(frame, text=round(price_per_bv, 2), font=SFON) label.grid(row=4 + row, column=i - 1, sticky="w") # 6th row (net profit[k]) label = tk.Label(frame, text=report[3][i], font=SFON) label.grid(row=5 + row, column=i - 1, sticky="w") # 7th row (number of shares[k]): label = tk.Label(frame, text=str(round(int(report[5][i]) / 1000)), font=SFON) label.grid(row=6 + row, column=i - 1, sticky="w") # 8th row (NMP - net profit margin (net_profit/net_income)*100%) nmp = (int(report[3][i]) / int(report[2][i])) * 100 label = tk.Label(frame, text=str(round(nmp, 2)) + "%", font=SFON) label.grid(row=7 + row, column=i - 1, sticky="w") # separator note_label = tk.Label(frame, text="_" * 200) note_label.grid(sticky="nw", columnspan=15) row += 9 frame.bind("<Button-3>", choose_action)