-
Notifications
You must be signed in to change notification settings - Fork 317
Closed
Description
import pandas as pd
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
class Kreditor:
def init(self, root):
self.root = root
self.root.title("Виды кредитования")
# Ограничения по видам кредита
self.allowed_credit_types = [
"Потребительский",
"Ипотечный",
"Автокредит",
"Образовательный",
"Для малого бизнеса"
]
# Максимальное количество кредитов
self.max_credits = 10 # Например, ограничение до 10 кредитов
# Заголовки колонок
self.columns = [
("ID", "id"),
("Вид кредита", "vid_kredita"),
("Цель кредита", "cel_kredita"),
("Сумма кредита", "summa_kredita"),
("Срок кредита (мес)", "srok_kredita"),
("Процентная ставка (%)", "procentnaya_stavka"),
("Обеспечение кредита", "obespeчение_kredita"),
("Условия погашения", "usloviya_pogasheniya"),
("Банк/Кредитор", "bank_kreditor"),
("Примечание", "primechanie")
]
# DataFrame для хранения данных
self.df = pd.DataFrame(columns=[col[1] for col in self.columns])
# Treeview для отображения данных
self.tree = ttk.Treeview(root, columns=[col[1] for col in self.columns], show="headings")
# Конфигурация колонок
for col in self.columns:
self.tree.heading(col[1], text=col[0])
self.tree.column(col[1], width=100)
self.tree.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)
# Кнопки
self.add_button = tk.Button(root, text="Добавить запись", command=self.add_record)
self.add_button.pack(pady=5)
self.edit_button = tk.Button(root, text="Редактировать запись", command=self.edit_record)
self.edit_button.pack(pady=5)
self.delete_button = tk.Button(root, text="Удалить запись", command=self.delete_record)
self.delete_button.pack(pady=5)
# Заполнение Treeview данными (если они есть в файле, например)
self.load_data()
def load_data(self):
try:
self.df = pd.read_csv("kredity.csv")
self.update_treeview()
except FileNotFoundError:
print("Файл kredity.csv не найден. Создается новый.")
self.df = pd.DataFrame(columns=[col[1] for col in self.columns])
except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка при загрузке данных: {e}")
def add_record(self):
if len(self.df) >= self.max_credits:
messagebox.showinfo("Внимание", f"Достигнуто максимальное количество кредитов ({self.max_credits}).")
else:
AddEditWindow(self, "Добавить запись", None, self.allowed_credit_types) # Передаём список типов
def edit_record(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showinfo("Внимание", "Выберите запись для редактирования.")
return
item_id = selected_item[0]
data = self.tree.item(item_id, 'values')
AddEditWindow(self, "Редактировать запись", item_id, data, self.allowed_credit_types) # Передаём список типов
def delete_record(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showinfo("Внимание", "Выберите запись для удаления.")
return
item_id = selected_item[0]
if messagebox.askyesno("Подтверждение", "Вы уверены, что хотите удалить эту запись?"):
index_to_delete = None
for i, item in enumerate(self.tree.get_children()):
if item == item_id:
index_to_delete = i
break
if index_to_delete is not None:
self.df = self.df.drop(self.df.index[index_to_delete])
self.df = self.df.reset_index(drop=True)
self.tree.delete(item_id)
self.save_data()
def update_treeview(self):
for item in self.tree.get_children():
self.tree.delete(item)
for index, row in self.df.iterrows():
self.tree.insert("", tk.END, values=list(row))
def save_data(self):
try:
self.df.to_csv("kredity.csv", index=False)
print("Данные успешно сохранены в kredity.csv")
except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка при сохранении данных: {e}")
class AddEditWindow:
def init(self, parent, title, item_id=None, existing_data=None, allowed_credit_types=None): # Получаем список типов
self.parent = parent
self.title = title
self.item_id = item_id
self.existing_data = existing_data
self.allowed_credit_types = allowed_credit_types # Сохраняем список типов
self.top = tk.Toplevel(parent.root)
self.top.title(self.title)
self.entries = {}
for i, col in enumerate(parent.columns):
label_text = col[0]
field_name = col[1]
tk.Label(self.top, text=label_text).grid(row=i, column=0, padx=5, pady=5, sticky=tk.W)
if field_name == "vid_kredita":
# Combobox для выбора вида кредита
self.entries[field_name] = ttk.Combobox(self.top, values=self.allowed_credit_types) # Используем Combobox
self.entries[field_name].grid(row=i, column=1, padx=5, pady=5, sticky=tk.E)
if self.existing_data:
self.entries[field_name].set(self.existing_data[i])
else:
# Обычное текстовое поле для остальных колонок
entry = tk.Entry(self.top)
entry.grid(row=i, column=1, padx=5, pady=5, sticky=tk.E)
if self.existing_data:
entry.insert(0, self.existing_data[i])
self.entries[field_name] = entry
self.save_button = tk.Button(self.top, text="Сохранить", command=self.save_data)
self.save_button.grid(row=len(parent.columns), column=0, columnspan=2, pady=10)
def save_data(self):
new_data = {}
for field_name, entry in self.entries.items():
if isinstance(entry, ttk.Combobox):
new_data[field_name] = entry.get() # Получаем значение из Combobox
else:
new_data[field_name] = entry.get()
# Валидация вида кредита
if new_data["vid_kredita"] not in self.allowed_credit_types:
messagebox.showerror("Ошибка", "Недопустимый вид кредита. Выберите из списка.")
return
new_row = pd.Series(new_data)
if self.item_id is None:
self.parent.df = self.parent.df.append(new_row, ignore_index=True)
else:
index_to_update = None
for i, item in enumerate(self.parent.tree.get_children()):
if item == self.item_id:
index_to_update = i
break
if index_to_update is not None:
self.parent.df.loc[index_to_update] = new_row
self.parent.update_treeview()
self.parent.save_data()
self.top.destroy()
if name == "main":
root = tk.Tk()
kreditor = Kreditor(root)
root.mainloop()
Metadata
Metadata
Assignees
Labels
No labels