Advertisement
ALEXANDAR_GEORGIEV

acc_calculator

Aug 10th, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.13 KB | None | 0 0
  1. from tkinter import *
  2. # from tkinter.ttk import * изпада в комфликт по отношение настройките на frame с tkinter
  3. from tkinter import ttk
  4. from tkinter.ttk import Treeview, Combobox
  5. from tkinter.ttk import Style
  6.  
  7. from Opiti.from_excel.classes.global_inc import registry
  8. from json_file_io import JsonFileIo
  9.  
  10.  
  11. class AccCalculator(Tk):
  12.     def __init__(self):
  13.         super().__init__()
  14.         self.check_assets = IntVar()
  15.         self.check_amort = IntVar()
  16.         self.sel = int()
  17.         self.last_code_entry = None
  18.         self.last_amount_entry = None
  19.         self.entry_asset_prd_amount = IntVar()
  20.         self.acc_data = {}
  21.         self.scr_bar = None
  22.         self.account = None
  23.         self.calc_text = None
  24.         self.btn_plus = None
  25.         self.btn_min = None
  26.  
  27.         # self.sel_acc = { # Данни за избора на юзъра
  28.         #     'code': None,  # Код на сметката, която юзъра е избрал от treeview-то
  29.         #     'key': None,  # Какво юзъра е избрал в combobox-а (едно от "close_d", "turn_d" и т.н.)
  30.         #     'value': None,  # Какво юзъра е избрал в combobox-а (стойността на избраното)
  31.         # }
  32.         self.sel_acc_code = None  # Код на сметката, която юзъра е избрал от treeview-то
  33.         self.sel_acc_key = None  # Какво юзъра е избрал в combobox-а (едно от "close_d", "turn_d" и т.н.)
  34.         self.sel_acc_human = None  # Какво юзъра е избрал в combobox-а (едно от "close_d", "turn_d" и т.н.)
  35.         self.sel_acc_value: None  # Какво юзъра е избрал в combobox-а (стойността на избраното)
  36.         self.account_key_options = [
  37.             { "key": "open_d", "prefix": "Н.Салдо Дт:" },
  38.             { "key": "open_c", "prefix": "Н.Салдо Кт:" },
  39.             { "key": "turn_d", "prefix": "Оборот  Дт:" },
  40.             { "key": "turn_c", "prefix": "Оборот  Кт:" },
  41.             { "key": "close_d", "prefix": "К.Салдо Дт:" },
  42.             { "key": "close_c", "prefix": "К.Салдо Кт:" },
  43.         ]
  44.         self.chain = []
  45.  
  46.     # Create Label
  47.     def label_n(self, geo, text_l, x, y, p=None, w=15, color='black', bg_color=None, bg_border=None, j=None):
  48.         border_colour = Frame(geo, background=bg_border)
  49.         border_colour.pack(padx=40, pady=40)
  50.         border_colour.place(x=x, y=y)
  51.         label = Label(border_colour, text=text_l, font=('Times New Roman', 10, 'italic'), bg=bg_color,
  52.                       padx=5, pady=5, bd=-1, width=w, anchor=p, fg=color, justify=j)
  53.         label.pack(padx=0, pady=(0, 1))
  54.     #
  55.     #
  56.     # # Create Entry
  57.     def entry_n(self, geo, x, y, w):
  58.         entry = Entry(geo, bd=4, width=w)
  59.         entry.place(x=x, y=y)
  60.         return entry
  61.  
  62.     def find_acc_data(self, acc_code):
  63.         for i in range(0, len(self.acc_data)):
  64.             #if isinstance(self.acc_data[i]['code'], str) or isinstance(self.acc_data[i]['code'], num):
  65.             #print(f"acc_data[{i}][code]: {self.acc_data[i]['code']}")
  66.             if self.acc_data[i]['code'] is not None:
  67.                 if str(acc_code) == self.acc_data[i]['code']:
  68.                     return self.acc_data[i]
  69.  
  70.         return None
  71.  
  72.     def on_selected_acc(self, source_treeview):
  73.         #self.account['values'] = []
  74.         current_item = source_treeview.focus()
  75.         values = source_treeview.item(current_item)["values"]
  76.         if not isinstance(values, list):
  77.             #print("values не е списък")
  78.             return
  79.  
  80.         code = values[0]
  81.         acc_data = self.find_acc_data(code)
  82.         print("code", code, "acc_data", acc_data)
  83.         self.account.delete('0', END)
  84.         self.account.insert('0', code)  #NEW
  85.  
  86.         self.sel_acc_code = code
  87.  
  88.         # self.account['values'] = [f"Н.Салдо Дт:    {acc_data['open_d']}",
  89.         #                           f"Н.Салдо Кт:    {acc_data['open_c']}",
  90.         #                           f"Оборот  Дт:    {acc_data['turn_d']}",
  91.         #                           f"Оборот  Кт:    {acc_data['turn_c']}",
  92.         #                           f"К.Салдо Дт:    {acc_data['close_d']}",
  93.         #                           f"К.Салдо Кт:    {acc_data['close_c']}"]
  94.  
  95.         option_values = []
  96.         for acc_key_option in self.account_key_options:
  97.             prefix = acc_key_option['prefix']
  98.             key = acc_key_option['key']
  99.             value = acc_data[key]
  100.             option_values.append(f"{prefix}    {value}")
  101.  
  102.         self.account['values'] = option_values
  103.  
  104.  
  105.  
  106.     # Да се извика когато юзъра избере от combobox-а стойност от сметката
  107.     def on_selected_acc_key(self):
  108.         #print("self.account.get()", self.account.get(), "self.account.current()", self.account.current())
  109.         idx = self.account.current()
  110.         option = self.account_key_options[idx]
  111.         print("idx", idx, "opt", option)
  112.         self.sel_acc_key = option["key"]
  113.         self.sel_acc_human = self.account.get()
  114.         acc_data = self.find_acc_data(self.sel_acc_code)
  115.         self.sel_acc_value = acc_data[self.sel_acc_key]
  116.         #print("self.sel_acc", self.sel_acc)
  117.         #self.chain.append(self.sel_acc)
  118.         #print("self.chain", self.chain)
  119.         self.btn_plus.config(state=NORMAL)
  120.         self.btn_min.config(state=NORMAL)
  121.  
  122.     def on_selected_operator(self, operator, btn):
  123.         if btn["state"] == "disabled":
  124.             return
  125.         if operator in ["+", "-"]:
  126.  
  127.             self.chain.append({
  128.                 "code": self.sel_acc_code,
  129.                 "key": self.sel_acc_key,
  130.                 "value": self.sel_acc_value,
  131.                 "human": self.sel_acc_human,
  132.             })
  133.             self.chain.append(operator)
  134.         print("self.chain", self.chain)
  135.         self.show_result()
  136.  
  137.     def show_result(self):
  138.         self.calc_text.delete('1.0', END)
  139.         result = 0
  140.         #isFirst = True
  141.         operator = "+"
  142.         text = ""
  143.         for node in self.chain:
  144.             if isinstance(node, dict):  # Брънката е речник
  145.                 text += f"{operator} "
  146.                 text += node["human"]
  147.                 text += "\n"
  148.                 if operator == "+":
  149.                     result += node["value"]
  150.                 elif operator == "-":
  151.                     result -= node["value"]
  152.             else:  # Брънката е стринг +/-
  153.                 operator = node
  154.             #isFirst = False
  155.         text += '----------------\n'
  156.         text += '=' + str(result)
  157.         self.calc_text.insert(INSERT, text)
  158.  
  159.  
  160.     def on_entry_key_release(self, entry, target_treeview, amount_entry):
  161.         self.last_code_entry = entry
  162.         self.last_amount_entry = amount_entry
  163.         entry_text = entry.get()
  164.  
  165.         if len(entry_text) < 2:
  166.             print("Няма достатъчно знаци:", entry_text)
  167.             return
  168.         term = entry_text
  169.         print("Има поне два знака:", term)
  170.         # TODO Намираме записите дето почват с t
  171.         self.found_rows_all_data = []
  172.         found_rows = []
  173.  
  174.         term_len = len(term)
  175.         for i in range(0, len(self.acc_data)):
  176.             if isinstance(self.acc_data[i]['code'], str):
  177.                 code_piece = self.acc_data[i]['code'][0:term_len]
  178.                 if term == code_piece:
  179.                     found_rows.append([
  180.                         self.acc_data[i]['code'],
  181.                         self.acc_data[i]['name'],
  182.                         self.acc_data[i]['close_c'],
  183.                     ])
  184.  
  185.  
  186.         target_treeview.delete(*target_treeview.get_children())
  187.         count_rows = len(found_rows)
  188.         target_treeview.config(height=count_rows)
  189.         i = 0
  190.         for found_row in found_rows:
  191.             print("В treeview добавяме ред", found_row)
  192.             target_treeview.insert('', END, values=found_row, tags=['t'])      # ????
  193.             target_treeview.tag_configure('t', background='SystemButtonFace')
  194.             i += 1
  195.             if i > 12:
  196.                 target_treeview.configure(height=13)
  197.  
  198.     def acc_choice(self):
  199.         pass
  200.  
  201.     def calculator(self):
  202.         json_file_io = JsonFileIo(file_name=registry["trial_balance_file_name"])
  203.         self.acc_data = json_file_io.read_content()
  204.  
  205.         self.title('Калкулатор')
  206.         self.geometry('1060x480+200+150')   #1060
  207.         self.resizable(False, False)
  208.         self.attributes('-topmost', 'true')
  209.  
  210.         # #Активи label_n(geo, text_l, x, y, p=None, w=15, color='black', bg_color=None, bg_border=None) w- ширина, р - подравняване
  211.  
  212.         self.label_n(self, 'СМЕТКА:', 20, 20, 'w', 8, 'black', bg_color=None, bg_border='red')
  213.         self.label_n(self, 'Налични сметки:', 560, 20, 'w', 20, 'black', bg_color=None, bg_border='red')
  214.  
  215.         self.entry_assets_prd = self.entry_n(self, 20, 60, 5)
  216.  
  217.         # TODO COMBObox
  218.         acc_option = StringVar()
  219.         self.account = Combobox(self, textvariable=acc_option, width=22)
  220.         self.account.place(x=70, y=60)
  221.         self.account.bind('<<ComboboxSelected>>', lambda event: self.on_selected_acc_key())
  222.  
  223.         self.account['state'] = 'normal'
  224.         #account.insert('0', "с/ка 409")
  225.         #account.bind('<<ComboboxSelected>>', lambda: acc_choice(self))
  226.  
  227.  
  228.         #self.entry_asset_prd_amount = self.entry_n(self, 420, 100, 14)
  229.         self.entry_assets_prd.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.entry_assets_prd,
  230.                                                         self.treeview_acc, self.entry_asset_prd_amount))
  231.         self.tv_frame = Frame(self)
  232.         self.tv_frame.place(x=560, y=60)
  233.         # TODO TREEVIEW
  234.         cols = ("code", "acc_name", "close_ap")
  235.         self.treeview_acc = Treeview(self.tv_frame, columns=cols, show='headings', height=0)
  236.         self.treeview_acc.heading('# 1', text='код', anchor='w')
  237.         self.treeview_acc.heading('# 2', text='сметка', anchor='w')
  238.         self.treeview_acc.heading('# 3', text='салдо', anchor='center')
  239.  
  240.         # treeview_acc.configure(background='SystemButtonFace')   # 'systemWindowBody'
  241.         style = Style(self)  # #D3D3D3, 'default', 'alt', 'clam', #40E0D0
  242.         style.theme_use('default')
  243.         print("style.theme_use() AAA", style.theme_use())
  244.         style.configure('Treeview',
  245.                         background='lightgrey',
  246.                         foreground='black',
  247.                         rowheight=25,
  248.                         fieldbackground='red'
  249.                         )
  250.         # Change selected color
  251.         style.map('Treeview', background=[('selected', 'blue')])
  252.  
  253.         # TODO Scroll_bar
  254.         self.scr_bar = Scrollbar(self.tv_frame, orient=VERTICAL)
  255.         self.scr_bar.pack(side=RIGHT, fill=Y)
  256.         self.treeview_acc.config(yscrollcommand=self.scr_bar.set)
  257.         self.scr_bar.config(command=self.treeview_acc.yview, bg="red", activebackground="orange")
  258.  
  259.         self.treeview_acc.column("code", width=60, anchor='w')
  260.         self.treeview_acc.column("acc_name", width=300, anchor='w')
  261.         self.treeview_acc.column("close_ap", width=100, anchor='e')
  262.         self.treeview_acc.bind('<ButtonRelease-1>', lambda e: self.on_selected_acc(self.treeview_acc))
  263.         #self.treeview_acc.place(x=560, y=60)
  264.         self.treeview_acc.pack(side=LEFT)
  265.  
  266.         # TODO TEXT field
  267.         self.calc_text = Text(self, width=40, height=21, bg='grey71', fg='#fff', font=('Sans Serif', 10, 'italic bold'))
  268.         # Insert text
  269.         self.calc_text.insert(INSERT, "Write Something\nAbout Yourself")
  270.         # Position
  271.         self.calc_text.place(x=240, y=60)
  272.  
  273.  
  274.         # Button cancel
  275.         butt_note = Button(self, text='Назад', font=('Bookman Old Style Bold', 8), fg='brown', height=1, width=7)
  276.         butt_note.place(x=20, y=240)
  277.         butt_note.bind('<ButtonRelease-1>')
  278.         # Button COPY
  279.         butt_note = Button(self, text='Копирай', font=('Bookman Old Style Bold', 8), fg='blue', height=1, width=7)
  280.         butt_note.place(x=20, y=280)
  281.         butt_note.bind('<ButtonRelease-1>')
  282.         # Button Изчисти
  283.         butt_note = Button(self, text='Изчисти', font=('Bookman Old Style Bold', 8), fg='red', height=1, width=7)
  284.         butt_note.place(x=20, y=320)
  285.         butt_note.bind('<ButtonRelease-1>')
  286.         # Button +
  287.         self.btn_plus = Button(self, text='+', font=('Bookman Old Style Bold', 8), fg='blue', height=1, width=7, state=DISABLED)
  288.         self.btn_plus.place(x=100, y=240)
  289.         self.btn_plus.bind('<ButtonRelease-1>', lambda e: self.on_selected_operator("+", self.btn_plus))
  290.         # Button -
  291.         self.btn_min = Button(self, text='-', font=('Bookman Old Style Bold', 8), fg='red', height=1, width=7, state=DISABLED)
  292.         self.btn_min.place(x=100, y=280)
  293.         self.btn_min.bind('<ButtonRelease-1>', lambda e: self.on_selected_operator("-", self.btn_min))
  294.         # Button =
  295.         butt_note = Button(self, text='=', font=('Bookman Old Style Bold', 8), fg='black', height=1, width=7)
  296.         butt_note.place(x=100, y=320)
  297.         butt_note.bind('<ButtonRelease-1>')
  298.  
  299.  
  300.  
  301.         # Button Помощ
  302.         butt_help = Button(self, text='Помощ', font=('Bookman Old Style Bold', 8), fg='black', height=1, width=10)
  303.         butt_help.place(x=20, y=430)
  304.         butt_help.bind('<ButtonRelease-1>')
  305.         # Button OK
  306.         butt_ok = Button(self, text='OK', font=('Bookman Old Style Bold', 8), fg='green', height=1, width=10)
  307.         butt_ok.place(x=830, y=430)
  308.         butt_ok.bind('<ButtonRelease-1>')
  309.         # Button Отказ
  310.         butt_exit = Button(self, text='ОТКАЗ', font=('Bookman Old Style Bold', 8), fg='red', height=1, width=10,
  311.                            command=self.destroy)
  312.         butt_exit.place(x=930, y=430)
  313.  
  314.  
  315.  
  316.         self.mainloop()
  317.  
  318.  
  319. if __name__ == '__main__':
  320.  
  321.     calc = AccCalculator()
  322.     calc.calculator()
  323.  
  324.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement