Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- # from tkinter.ttk import * изпада в комфликт по отношение настройките на frame с tkinter
- from tkinter import ttk
- from tkinter.ttk import Treeview, Combobox
- from tkinter.ttk import Style
- import re
- from Opiti.from_excel.classes.global_inc import registry
- from json_file_io import JsonFileIo
- class AccountTree():
- def __init__(self):
- self.struct = {} # Родословно дърво сметки
- self.children = None
- self.top_digits = {} # На коя сметка колко цифри има в първата група
- self.groups = {} # На коя сметка колко групи има
- self.top_group_max_digits_count = None
- self.max_groups_count = None
- # code е нешо от типа "123-456-789"
- def add_code(self, code):
- self.children = None # Нулираме кеша на родители-деца
- # "123-456-789" дава ["123", "456", "789"]
- groups_digits = re.findall('[0-9]+', code)
- # "123-456-789" дава ["-", "-"]
- groups_seps = re.findall('[^0-9]+', code)
- groups_digits_len = len(groups_digits)
- # Следим
- if self.max_groups_count is None:
- self.max_groups_count = groups_digits_len
- elif groups_digits_len > self.max_groups_count:
- self.max_groups_count = groups_digits_len
- # От този код трябва да построим този клон:
- #1
- #12
- #123
- #123-456
- #123-456-789
- # Напр 123 # groups_digits е списък с групите
- top_group_digits = groups_digits[0] # Първата група
- #print("top_group_digits", top_group_digits)
- top_group_digits_len = len(top_group_digits) # Брой цифри в 1-вата група
- # В ancestors ще трупаме [сметка, родител, пра-родител и т.н.] но по цели групи от цифри
- ancestors = []
- ancestors_top_group_digits = []
- ancestors_groups = []
- # За ["123", "456", "789"] len1 ще мине през 3, 2, 1
- for len1 in range(groups_digits_len, 0, -1):
- # len1=3 дава ["123", "456", "789"]
- # len1=2 дава ["123", "456"]
- # len1=1 дава ["123"]
- code1 = ""
- # len1=3, то idx ше мине през 0, 1, 2
- # len1=2, то idx ше мине през 0, 1
- # len1=1, то idx ше мине през 0
- for idx in range(len1):
- if code1 != "":
- code1 += groups_seps[idx - 1]
- pass
- code1 += groups_digits[idx]
- ancestors.append(code1)
- ancestors_top_group_digits.append(top_group_digits_len)
- ancestors_groups.append(len1)
- #print("code1", code1)
- # print("След анализ на групите: ancestors", ancestors)
- # Следим коя е най-дългата първа група
- if self.top_group_max_digits_count is None:
- self.top_group_max_digits_count = top_group_digits_len
- elif top_group_digits_len > self.top_group_max_digits_count:
- self.top_group_max_digits_count = top_group_digits_len
- # В следния цикъл добавяме в ancestors и родителите на 1-вата група до една цифра
- #print("top_group_digits_len", top_group_digits_len)
- for len1 in range(top_group_digits_len-1, 0, -1):
- #print("len1", len1)
- code1 = top_group_digits[0: len1]
- ancestors.append(code1)
- ancestors_top_group_digits.append(len1)
- ancestors_groups.append(1)
- # print("След анализ на първата група: ancestors", ancestors)
- # В тази точка ancestors съдържа всички прародители до 1 цифра
- # Сега обхождаме ancestors, за да добавим връзките дете-към-родител в self.struct
- ancestors_len = len(ancestors)
- for idx in range(ancestors_len):
- child = ancestors[idx]
- child_top_group_digits_len = ancestors_top_group_digits[idx]
- child_groups = ancestors_groups[idx]
- parent_idx = idx + 1
- if parent_idx < ancestors_len: # Бащата присъства в списъка
- parent = ancestors[parent_idx] # Вземаме бащата от списъка
- else: # Бащата не е в списъка
- parent = "" # Затова бащата е коренът
- if child in self.struct:
- # Няма нужда са се минава нататък през родителите му, понеже те вече са вписани
- #print(f"Вече е вписано, че {child} има родител {parent}, пропускаме останалото родословие")
- break
- else:
- self.struct[child] = parent
- self.top_digits[child] = child_top_group_digits_len
- self.groups[child] = child_groups
- # print('ancestors', ancestors)
- def get_max_groups_count(self):
- return self.max_groups_count
- def get_top_group_max_digits_count(self):
- return self.top_group_max_digits_count
- def get_top_group_digits(self, code):
- return self.top_digits[code]
- def get_groups(self, code):
- return self.groups[code]
- def print_struct(self):
- #up_struct = {x: y for y, x in self.struct.items()} # ДА, ама НЕ, не може да се повтарят KEYS !!!
- print('struct', self.struct)
- #print('up_struct', up_struct)
- # equal_parent = [value for value in self.struct if self.struct[value] == self.struct[value]]
- # print('equal_parent', equal_parent)
- # for value in equal_parent:
- # print(value, ':', self.struct[value])
- up_struct = {}
- key_up_struct = ''
- for key in self.struct:
- if self.struct[key] == self.struct[key]:
- key_up_struct = self.struct[key]
- if key_up_struct in up_struct:
- up_struct[key_up_struct] += [key]
- elif key_up_struct not in up_struct:
- up_struct[key_up_struct] = [key]
- print('up_struct', up_struct)
- # Връща list с само преките деца на даден code
- def get_children(self, code):
- if self.children is None:
- self.children = {}
- # Ще бъде речник с изброени преки деца на всяка сметка {"150": ["150-1", "150-2", ...], ...}
- for child in self.struct:
- parent = self.struct[child]
- if parent not in self.children:
- self.children[parent] = []
- self.children[parent].append(child)
- #print("self.children", self.children)
- if code in self.children: # Ако кодът има деца...
- return self.children[code] # връшаме ги
- # Щом сме стигнали дотук, кодът няма деца
- return [] # Затова връщаме празен списък
- # Връща list с всички деца, внуци и т.н. на даден код
- def get_all_children(self, code, max_depth = 999):
- if max_depth == 0:
- return []
- max_depth -= 1
- processed = []
- children = self.get_children(code)
- #print(f"АААААА {code} има за деца {children}")
- depth = 0
- while depth < max_depth:
- children1 = []
- for child in children:
- children1.append(child)
- if child in processed: # вече сме добавили преките деца на това дете
- continue # затова пропускаме
- children2 = self.get_children(child)
- #print(f"Ниво {depth}: {child} има за деца {children2}")
- processed.append(child)
- for child2 in children2:
- children1.append(child2)
- #print(f"Заместваме {children} с {children1}")
- children = children1
- depth += 1
- return children
- def get_parent(self, acc_code):
- # print(f"acc_code {acc_code}")
- if acc_code is None:
- return None
- if acc_code in self.struct[acc_code]:
- return self.struct[acc_code]
- # В TrialBalanceFilter на много места се искаме да знаем дали code1 е дете на code2.
- # Там правим сложни аналзи на групи цифри -- те трябва да се махнат.
- # ТАМ има self.acc_tree, което е обект от клас AccountTree
- # AccountTree tрябва да се сдобие с методи като is_child() по-долу,
- # kойто да отговаря на тоя въпрос като използва своя self.struct
- def is_child(self, child, parent):
- # Трябва да връша true или false
- pass
- def is_parent(self, child, parent):
- # Трябва да връша true или false
- pass
- # Проверява колко нива е детето под родителя
- def get_depth(self, child, parent):
- pass
- class TrialBalanceFilter(Tk):
- def __init__(self):
- super().__init__()
- self.check_assets = IntVar()
- self.check_amort = IntVar()
- self.sel = int()
- self.last_code_entry = None
- self.last_amount_entry = None
- self.entry_asset_prd_amount = IntVar()
- self.acc_data = {} # Сурови данни от Ексел
- self.acc_data1 = {} # Данни от Ексел, но в речник за ускорен достъп по код на сметката
- self.acc_tree = AccountTree() # Дърво на кодовете
- self.scr_bar = None
- self.account = None
- self.calc_text = None
- self.btn_plus = None
- self.btn_min = None
- self.var = IntVar()
- self.current_value = StringVar()
- self.current_value_tree = StringVar()
- self.level_code = None
- self.level_code_tree = None
- self.level_tree = []
- self.spin_box_tree_values = ["0"]
- self.spin_box_tree = None
- self.label_frame = None
- self.label_frame_p = None
- self.label_frame_r = None
- self.v = StringVar()
- self.v.trace("w", lambda *args: self.on_change_radio())
- self.radiobutton_list = {'da': "ДА", 'mz': "МЗ", 'wz_zd': "Вземания", 'invest': "Инвест", 'money': "Пари", 'rbp': "РБП", 'drugi_a': "Други",
- 'sk': "СК", 'provision': 'Провизии', 'zd': "Задълж.", 'pbp': "ПБП", 'drugi_p': "Други",
- 'px': "Приходи", 'rx': 'Разходи', 'drugi_pr': "Други"
- }
- self.radios = {}
- self.mapped_types = {} # Само тези, които потребителя директно е мапнал
- self.eff_mapped_types = {} # Всички, които са мапнати директно от потребителя или автоматично от нас
- self.correction_mode = False
- def on_change_radio(self):
- # print("Стойността на реадиобутона сега е ", self.v.get())
- pass
- def on_save(self):
- mapped_type = self.v.get()
- # print("Активният реадиобутон е ", mapped_type)
- selected_acc_codes = self.treeview_acc.selection()
- # print(f"Избрани са сметките {selected_acc_codes}")
- # TODO Избраните сметки да се запомни типа в речник
- # СЛЕДВА:
- # Да се провери дали родителите на новомаркираните сметки имат същия тип.
- # Ако имат същия тип -- добре
- # Ако имат друг тип, родителите да получат тип "смесен"
- for acc_code in selected_acc_codes: # Цикъл през iid-тата на избраните редове
- self.mapped_types[acc_code] = mapped_type
- # На реда с iid=acc_code в колоната "type" слагаме човешкия етикет за mapped_type
- self.treeview_acc.set(acc_code, "type", self.radiobutton_list[mapped_type])
- # print("self.mapped_types", self.mapped_types)
- self.disable_correction_mode()
- # Избрания тип да се отрази в колоната "вид"
- # Всички с вид или да се деактивират и/или ако в селекцията има сметки с вид, да не работят бутоните
- # Радиобутините се изчистват и забраняват
- # При маркирането на елемент, се маркират и деца/родители,
- # Затова трябва наново да препопълни TreeView-то
- # или поне да се ъпдейтне колоната с типа.
- # Засега препопълваме:
- self.populate_accounts()
- def on_correction(self):
- self.enable_correction_mode()
- def enable_correction_mode(self):
- self.correction_mode = True
- # print("Изкл корекции")
- def disable_correction_mode(self):
- self.correction_mode = False
- # print("Вкл корекции")
- def radio_b(self):
- self.v.set(' ')
- place = self.label_frame
- y = 0
- for radio in self.radiobutton_list:
- # print(f"radio {radio}")
- self.radios[radio] = Radiobutton(place, text=self.radiobutton_list[radio], variable=self.v, value=radio, state='disabled' )
- self.radios[radio].grid(row=y, column=0, padx=10, sticky='w')
- y += 1
- if 6 < y < 12:
- place = self.label_frame_p
- elif 11 < y < 16:
- place = self.label_frame_r
- def update_account_type_radio(self):
- selected_items = self.treeview_acc.selection()
- #print(selected_items)
- if len(selected_items) == 0:
- # TODO Всички радиобутони да се забранят
- for radioKey in self.radios:
- #print(f"radioKey {radioKey} self.radios[radioKey] {self.radios[radioKey]}")
- self.radios[radioKey].configure(state="disabled")
- else:
- for radioKey in self.radios:
- #print(f"radioKey {radioKey} self.radios[radioKey] {self.radios[radioKey]}")
- self.radios[radioKey].configure(state="normal")
- # Проверява дали сред избраните има вече маркирани/мапнати и ги де-избира
- def verify_selection(self):
- # print(f"verify_selection: correction_mode is {self.correction_mode}")
- # Ако сме в режим корекция, няма да се бъркаме в селекцията на потребителя
- # и той ще може да редактира дори вече маркираните/мапнати сметки
- if (self.correction_mode):
- # print("Режим корекция е включен, не пипаме селекцията")
- return
- # print("Режим корекция не е включен, проверяваме селекцията")
- #print(f"{__name__}() .eff_mapped_types {self.eff_mapped_types}")
- selected_items = self.treeview_acc.selection()
- # print("selected_items BBBB", selected_items)
- for code in selected_items:
- if code is not None:
- eff_type = self.get_eff_type(code)
- if eff_type is None:
- pass
- else:
- self.treeview_acc.selection_remove(code)
- #if code in self.eff_mapped_types:
- # self.treeview_acc.selection_remove(code)
- def on_selected_acc(self):
- self.verify_selection()
- self.update_account_type_radio()
- def get_eff_type(self, acc_code):
- if acc_code is None:
- return None
- # Ако типа е маркиран директно от юзъра, връщаме директно тоя тип
- if acc_code in self.mapped_types:
- return self.mapped_types[acc_code]
- # Ако юзъра е маркирал (пра)родител, връщаме типа на (пра)родителя
- # Ще се качваме нагоре към родител и пра-родител докато:
- # * срещнем маркиран родител -- тогава ще върнем типа му
- # * опрем в корена -- значи нито един (пра)родител няма туп
- parent = acc_code
- # print(self.acc_tree)
- while True:
- # Един родител нагоре
- parent = self.acc_tree.get_parent(parent)
- # Опрели сме до корена
- if parent is None:
- break # Няма повече родители
- if parent == "":
- break # Няма повече родители
- # Намерили сме маркиран родител
- if parent in self.mapped_types:
- return self.mapped_types[parent]
- # Засега си милим, че тук няма нужда да се гледат типовете на децата
- # Не сме намерили маркиран родител/дете, значи нямаме тип
- return None
- def update_eff_mapped_types(self):
- self.eff_mapped_types = {}
- # Автоматично маркиране:
- # A. Маркирани-от-юзъра сметки
- # B. Всички немаркирани-от-юзъра деца на маркирани-от-юзъра сметки (най-близък маркиран-от-юзъра родител!)
- # C. Немаркирани-от-юзъра родители, на когото всички деца са маркирани от юзъра с един тип (преки деца!)
- # Забрана срещу маркиране:
- # A. Всички автоматично маркирани
- # C. Немаркирани-от-юзъра родители, чиито всички деца са маркирани (преки деца!)
- for acc_code, acc_type in self.mapped_types.items():
- # Кода е маркиран от юзъра, запомняме го:
- self.eff_mapped_types[acc_code] = acc_type
- children_codes = self.acc_tree.get_all_children(acc_code)
- for child_code in children_codes:
- # Ако детето е посочено от юзъра, не го пипаме
- if child_code in self.mapped_types:
- continue
- # Детето не е посочено от юзъра, присвояваме му типа на родителя
- self.eff_mapped_types[child_code] = acc_type
- def populate_accounts(self):
- #print("Сега ще извкаме self.current_value.get() А")
- self.level_code = self.current_value.get()
- #print("Сега ще извкаме self.current_value.get() Б")
- self.level_code = self.current_value.get()
- self.level_code = int(self.level_code)
- self.level_code_tree = self.current_value_tree.get()
- self.level_code_tree = int(self.level_code_tree)
- # TODO Пълним Treeview
- self.treeview_acc.delete(*self.treeview_acc.get_children())
- found_rows = []
- total_sum_row = [
- "", # code
- "Обща сума", # name
- 0, #open_d
- 0, #open_c
- 0, #open_c
- 0, #turn_c
- 0, #close_d
- 0, #close_c
- ]
- # Събиране на редовете според първия спин-бокс БЛОК А
- for code in self.acc_data1:
- if code is None:
- continue
- acc_row = self.acc_data1[code]
- # print("acc_row", acc_row)
- top_group_digits = self.acc_tree.get_top_group_digits(code)
- groups = self.acc_tree.get_groups(code)
- if groups == 1 and top_group_digits == self.level_code:
- found_rows.append([
- code,
- acc_row['name'],
- acc_row['open_d'],
- acc_row['open_c'],
- acc_row['turn_d'],
- acc_row['turn_c'],
- acc_row['close_d'],
- acc_row['close_c'],
- ])
- # print("total_sum_row AAA", total_sum_row)
- if acc_row['open_d'] is not None:
- total_sum_row[2] += acc_row['open_d']
- if acc_row['open_c'] is not None:
- # print("+acc_row[open_c]", acc_row['open_c'])
- total_sum_row[3] += acc_row['open_c']
- if acc_row['turn_d'] is not None:
- total_sum_row[4] += acc_row['turn_d']
- if acc_row['turn_c'] is not None:
- total_sum_row[5] += acc_row['turn_c']
- if acc_row['close_d'] is not None:
- total_sum_row[6] += acc_row['close_d']
- if acc_row['close_c'] is not None:
- total_sum_row[7] += acc_row['close_c']
- # Добавяме наследниците
- # Генерираме изкуствен ред със сумите
- for i in range(2, 8):
- total_sum_row[i] = f"{total_sum_row[i]:.2f}"
- # print("total_sum_row final", total_sum_row)
- # print("acc_data", self.acc_data)
- # Към списъка с намерените добавяме реда с общите суми:
- found_rows.append(total_sum_row)
- # Събиране редове от следващите нива -- до дълбочината сочена от втория спин-бокс
- if self.level_code in [1, 2]: # Първи спин-бокс 1 или 2 БЛОК Б1
- # Тук втория спин-бокс ще бъде ограничен 0 или 1
- if self.level_code_tree == 0:
- # print("Втория спин-бокс е 0, не вмъкваме редове")
- pass # Няма нужда да вмъкваме нови редове
- elif self.level_code_tree == 1:
- # print("Втория спин-бокс е 1, ще вмъкваме редове")
- found_rows1 = []
- for row in found_rows:
- found_rows1.append(row)
- parent_code = row[0]
- parent_code_len = len(parent_code)
- # print("parent_code", parent_code, "parent_code_len", parent_code_len)
- for i in range(0, len(self.acc_data)):
- if isinstance(self.acc_data[i]['code'], str):
- child_code = self.acc_data[i]['code']
- child_code_len = len(child_code)
- # print("child_code", child_code, "child_code_len", child_code_len)
- groups_digits = re.findall('[0-9]+', self.acc_data[i]['code'])
- len_diff = child_code_len - parent_code_len
- # child_code.startswith(parent_code) OK кода на детето да започва с този на родителя
- # и да е дълъг с 1 цифра повече
- # len(groups_digits) == 1 ОК се състои от 1 група цифри
- if len(groups_digits) == 1 and child_code.startswith(parent_code) and len_diff == 1:
- # if len(self.acc_data[i]['code']) == self.level_code:
- found_rows1.append([
- self.acc_data[i]['code'],
- self.acc_data[i]['name'],
- self.acc_data[i]['open_d'],
- self.acc_data[i]['open_c'],
- self.acc_data[i]['turn_d'],
- self.acc_data[i]['turn_c'],
- self.acc_data[i]['close_d'],
- self.acc_data[i]['close_c'],
- ])
- # Подменяме оригиналния списък с новия
- found_rows = found_rows1
- else: # Първи спин-бокс 3 и по-високо, втория може да е всякакъв БЛОК Б2
- # Напр ако втория спин-бокс казва 2, това ще се завърти 2 пъти:
- parent_codes = []
- for depth in range(0, self.level_code_tree): #range(0, 1)
- found_rows2 = []
- added_children = 0
- for row in found_rows:
- found_rows2.append(row)
- parent_code = row[0]
- parent_groups_digits = re.findall('[0-9]+', parent_code)
- parent_groups_digits_len = len(parent_groups_digits)
- if parent_code == "": # Пропускаме, понеже това е реда с тотала
- continue
- if parent_code in parent_codes: # Пропускаме, ако преките деца на този родител са вече добавени
- continue
- # Ако code="101-3", то code_groups_digits=["101", "3"]
- # Желан брой грипи цифри, които искаме детето да има
- #print("parent_code", parent_code, "len(self.acc_data)", len(self.acc_data))
- for i in range(0, len(self.acc_data)):
- added_children = 0
- if isinstance(self.acc_data[i]['code'], str):
- child_code = self.acc_data[i]['code']
- #print("child_code", child_code)
- groups_digits = re.findall('[0-9]+', self.acc_data[i]['code'])
- groups_digits_len = len(groups_digits)
- diff_groups_len = groups_digits_len - parent_groups_digits_len
- # child_code.startswith(parent_code) OK кода на детето да започва с този на родителя
- # groups_digits_len = wanted_groups_count ОК Броя групи цифри в кода на детето да е равен на желания
- is_child = True
- if diff_groups_len == 1: # Първо условие е детето да има точно 1 група повече от родителя
- # Проверяваме дали първите групи на детето съвпадат с родителските
- for idx in range(parent_groups_digits_len):
- parent_digits = parent_groups_digits[idx]
- child_digits = groups_digits[idx]
- if parent_digits != child_digits: # Дори една група да не съвпада...
- is_child = False # ...значи не е дете
- break
- else: # Детето е с неподходящ брой групи...
- is_child = False # ...значи не е дете
- if is_child:
- if child_code in ["100", "401-74-13", "601-11-1"]:
- pass
- # print(f"Добавяме дете {child_code} заради родител {parent_code}")
- #print(f"Добавяме дете {child_code} към родител {parent_code}")
- added_children += 1
- # if len(self.acc_data[i]['code']) == self.level_code:
- found_rows2.append([
- self.acc_data[i]['code'],
- self.acc_data[i]['name'],
- self.acc_data[i]['open_d'],
- self.acc_data[i]['open_c'],
- self.acc_data[i]['turn_d'],
- self.acc_data[i]['turn_c'],
- self.acc_data[i]['close_d'],
- self.acc_data[i]['close_c'],
- ])
- # Запомняме, че вече сме добавили преките деца на този родител
- parent_codes.append(parent_code)
- # print("len(self.acc_data)", len(self.acc_data))
- # print(f"depth {depth} Предното ниво имаше {len(found_rows)} с добавени {added_children} деца новото ниво редовете са {len(found_rows2)}")
- found_rows = found_rows2
- # TODO Поставяне на намерените редове в таблицата
- count_rows = len(found_rows)
- # self.treeview_acc.config(height=count_rows)
- # print('found_rows', found_rows)
- self.eff_mapped_types = {}
- i = 0
- for found_row in found_rows:
- code = found_row[0] # Код за който се чудим има ли зададен тип
- type = None
- type_human = ""
- if code in self.mapped_types: # Има зададен тип директно за този код
- type = self.mapped_types[code]
- type_human = self.radiobutton_list[type]
- else: # Няма зададен тип директно за този код
- # Затова ще търсим дали сред мапнатите кодове има родител на този, за който се чудим
- groups_digits = re.findall('[0-9]+', code)
- groups_digits_len = len(groups_digits)
- if groups_digits_len == 1: # Чудим се за код, който има само 1 група цифри
- for mapped_code in self.mapped_types:
- if code.startswith(mapped_code):
- type = self.mapped_types[mapped_code]
- type_human = self.radiobutton_list[type]
- break
- else: # Чудим се за код, който има повече от 1 група цифри -- дали е дете на мапнат код
- for mapped_code in self.mapped_types: # Върви през всички кодове, мапнати от потребителя
- mapped_groups_digits = re.findall('[0-9]+', mapped_code) # Групи цифри в код, мапнат от потребителя
- mapped_groups_digits_len = len(mapped_groups_digits) # Брой групи цифри
- if mapped_groups_digits_len < groups_digits_len: # Кода за който се чудим може да е дете на мапнат код
- # Да проверим дали групите съвпадат
- is_child = True
- for idx in range(mapped_groups_digits_len):
- parent_digits = mapped_groups_digits[idx]
- child_digits = groups_digits[idx]
- if parent_digits != child_digits:
- is_child = False
- break
- if is_child:
- type = self.mapped_types[mapped_code]
- type_human = self.radiobutton_list[type]
- break
- # На този етап сме проверили дали code е дете на мапнат код
- if type is None: # Не е дете -- значи трябва да проверим дали е родител на мапнати кодове
- pass
- if type is not None: # Успели сме да намерим тип
- self.eff_mapped_types[code] = type
- found_row5 = []
- found_row5.append(type_human)
- found_row5.append(found_row[0])
- found_row5.append(found_row[1])
- found_row5.append(found_row[2])
- found_row5.append(found_row[3])
- found_row5.append(found_row[4])
- found_row5.append(found_row[5])
- found_row5.append(found_row[6])
- found_row5.append(found_row[7])
- iid = found_row[0]
- tags = []
- if found_row[0] == "":
- tags = ["total"]
- iid = "total"
- self.treeview_acc.insert('', END, values=found_row5, tags=tags, iid=iid) # Добавя ред в Treeview
- i += 1
- if count_rows > 30:
- self.treeview_acc.configure(height=30)
- else:
- self.treeview_acc.configure(height=count_rows)
- # print("self.eff_mapped_types", self.eff_mapped_types)
- def spin_box_select(self):
- # print("Викаме elf.current_value.get() В")
- self.level_code = self.current_value.get()
- self.level_code = int(self.level_code)
- self.populate_accounts()
- def filter(self): # TODO Начало
- json_file_io = JsonFileIo(file_name=registry["trial_balance_file_name"])
- self.acc_data = json_file_io.read_content()
- # Инициализираме дървото с всички кодове от Ексел
- for acc_row in self.acc_data:
- acc_code = acc_row["code"]
- self.acc_data1[acc_code] = acc_row
- # Прескачаме реда със сумата, както и евентуални паразитни редове без код
- if acc_code is None or acc_code == "":
- continue
- self.acc_tree.add_code(acc_code)
- self.acc_tree.print_struct()
- self.title('Оборотна ведомост')
- self.geometry('1200x840+200+10') # 1060
- self.resizable(False, False)
- self.attributes('-topmost', 'true')
- # TODO Label frame, Видове сметки
- self.label_frame = LabelFrame(self, text='Актив', relief=GROOVE, bd=2, width=10, font=('Timesbd', 9, 'italic'), fg='blue')
- self.label_frame.place(x=20, y=60)
- self.label_frame_p = LabelFrame(self, text='Пасив', relief=GROOVE, bd=2, width=10, font=('Timesbd', 9, 'italic'), fg='blue')
- self.label_frame_p.place(x=20, y=270)
- self.label_frame_r = LabelFrame(self, text='Пх/Рх', relief=GROOVE, bd=2, width=10, font=('Timesbd', 9, 'italic'), fg='blue')
- self.label_frame_r.place(x=20, y=430)
- # TODO Radio buttons
- self.radio_b()
- # TODO Spinbox Синтетични сметки
- spin_box_max = self.acc_tree.get_top_group_max_digits_count()
- spin_box = Spinbox(self, from_=1, to=spin_box_max,
- width=8, justify='center', textvariable=self.current_value, wrap=True)
- self.current_value.set(value='3')
- self.current_value.trace("w", lambda *args: self.spin_box_select()) # Закача реакция при промяна на спинбокса
- self.current_value.trace("r", lambda *args: print("Някой чете стойността")) # За дебъг
- spin_box.place(x=200, y=30)
- # TODO Spinbox Аналитични сметки
- spin_box_max = self.acc_tree.get_max_groups_count() - 1
- self.spin_box_tree = Spinbox(self, command=self.populate_accounts, from_=0, to=spin_box_max,
- width=8, justify='center', textvariable=self.current_value_tree, wrap=True)
- self.current_value_tree.set(value='0')
- self.spin_box_tree.place(x=280, y=30)
- # TODO TREEVIEW
- self.tv_frame = Frame(self)
- self.tv_frame.place(x=150, y=50)
- cols = ("type", "code", "acc_name", "open_d", 'open_c', 'turn_d', 'turn_c', 'close_d', 'close_c')
- self.treeview_acc = Treeview(self.tv_frame, columns=cols, show="headings", height=0)
- self.treeview_acc.heading('# 1', text='вид', anchor='w')
- self.treeview_acc.heading('# 2', text='код', anchor='w')
- self.treeview_acc.heading('# 3', text='сметка', anchor='w')
- self.treeview_acc.heading('# 4', text='НС Дебит', anchor='center')
- self.treeview_acc.heading('# 5', text='НС Кредит', anchor='center')
- self.treeview_acc.heading('# 6', text='Об. Дебит', anchor='center')
- self.treeview_acc.heading('# 7', text='Об. Кредит', anchor='center')
- self.treeview_acc.heading('# 8', text='КС Дебит', anchor='center')
- self.treeview_acc.heading('# 9', text='КС Кредит', anchor='center')
- self.treeview_acc.tag_configure('total', font=('Timesbd', 9, 'bold'))
- self.treeview_acc.bind('<ButtonRelease-1>', lambda e: self.on_selected_acc())
- # treeview_acc.configure(background='SystemButtonFace') # 'systemWindowBody'
- style = Style(self) # #D3D3D3, 'default', 'alt', 'clam', #40E0D0
- style.theme_use('default')
- # print("style.theme_use() AAA", style.theme_use())
- style.configure('Treeview',
- background='lightgrey',
- foreground='black',
- rowheight=25,
- fieldbackground='red'
- )
- # Change selected color
- style.map('Treeview', background=[('selected', 'blue')])
- # TODO Scroll_bar
- self.scr_bar = Scrollbar(self.tv_frame, orient=VERTICAL)
- self.scr_bar.pack(side=RIGHT, fill=Y)
- self.treeview_acc.config(yscrollcommand=self.scr_bar.set)
- self.scr_bar.config(command=self.treeview_acc.yview, bg="red", activebackground="orange")
- self.treeview_acc.column("type", width=60, anchor='w')
- self.treeview_acc.column("code", width=60, anchor='w')
- self.treeview_acc.column("acc_name", width=300, anchor='w')
- self.treeview_acc.column("open_d", width=100, anchor='e')
- self.treeview_acc.column("open_c", width=100, anchor='e')
- self.treeview_acc.column("turn_d", width=100, anchor='e')
- self.treeview_acc.column("turn_c", width=100, anchor='e')
- self.treeview_acc.column("close_d", width=100, anchor='e')
- self.treeview_acc.column("close_c", width=100, anchor='e')
- self.treeview_acc.pack(side=LEFT)
- self.spin_box_select()
- # TODO Button Запис
- butt_save = Button(self, text='Запис', font=('Bookman Old Style Bold', 9), fg='red', height=1, width=11)
- butt_save.place(x=20, y=550)
- butt_save.bind('<ButtonRelease-1>', lambda e: self.on_save())
- # TODO Button OK
- butt_ok = Button(self, text='OK', font=('Bookman Old Style Bold', 8), fg='green', height=1, width=11)
- butt_ok.place(x=20, y=580)
- butt_ok.bind('<ButtonRelease-1>')
- # TODO Button Корекции
- butt_ok = Button(self, text='Корекции', font=('Bookman Old Style Bold', 8), fg='darkred', height=1, width=10)
- butt_ok.place(x=20, y=764)
- butt_ok.bind('<ButtonRelease-1>', lambda e: self.on_correction())
- # TODO Button Помощ
- butt_help = Button(self, text='Помощ', font=('Bookman Old Style Bold', 8), fg='black', height=1, width=10)
- butt_help.place(x=20, y=794)
- butt_help.bind('<ButtonRelease-1>')
- self.mainloop()
- if __name__ == '__main__':
- #acc_tree = AccountTree()
- #acc_tree.add_code("123-456.789/435 0987")
- #acc_tree.print_struct()
- #acc_tree.add_code("123-456.789/435 0987 888 999")
- #acc_tree.print_struct()
- #acc_tree.add_code("123-456.789/435 0989")
- # code = "123"
- # children = acc_tree.get_children(code)
- # print(f'children of {code}: ', children)
- # code = "123-456.789/435"
- # children = acc_tree.get_children(code)
- # print(f'children of {code}: ', children)
- #
- # code = "123"
- # depth = 0
- # children = acc_tree.get_all_children(code, depth)
- # print(f'Всички деца на {code} до дълбочина {depth}: ', children)
- #
- # code = "123"
- # depth = 1
- # children = acc_tree.get_all_children(code, depth)
- # print(f'Всички деца на {code} до дълбочина {depth}: ', children)
- #
- # code = "123"
- # depth = 2
- # children = acc_tree.get_all_children(code, depth)
- # print(f'Всички деца на {code} до дълбочина {depth}: ', children)
- #
- # code = "123"
- # depth = 3
- # children = acc_tree.get_all_children(code, depth)
- # print(f'Всички деца на {code} до дълбочина {depth}: ', children)
- # acc_tree.print_struct()
- # code = "123-456.789/435 0989"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "123-456.789/435"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "123-456.789"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "123-456"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "123"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "12"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- # code = "1"
- # a = acc_tree.get_top_group_digits(code)
- # b = acc_tree.get_groups(code)
- # print(f"Сметка {code} има {a} цифри в топ-групата и {b} групи общо" )
- calc = TrialBalanceFilter()
- calc.filter()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement