경비 추적기는 개인과 기업 모두의 금융 거래를 효과적으로 관리할 수 있는 필수 도구입니다. 이러한 도구를 활용하면 예산 작성을 통해 자원을 효율적으로 할당하고, 카테고리별로 지출을 구성하며, 지출 습관의 추세를 면밀히 조사하여 재정 의사 결정 프로세스를 최적화할 수 있습니다.

프로그래밍 언어로 Python을 사용하여 크로스 플랫폼 그래픽 사용자 인터페이스를 갖춘 비용 모니터링 애플리케이션을 구축하는 방법을 탐색합니다.

Tkinter, CSV, Matplotlib 모듈

tkinter 라이브러리를 사용하여 경비 추적 애플리케이션을 개발하기 위해서는 csv, matplotlib, tkinter 자체 등 세 가지 패키지를 추가로 가져와야 합니다.

Tkinter를 사용하면 Python 애플리케이션 내에서 그래픽 사용자 인터페이스를 생성할 수 있으며, 버튼, 레이블, 텍스트 필드와 같은 사용자 지정 가능한 요소 배열을 제공하여 GUI 기반 프로그램을 효율적으로 개발할 수 있습니다.

Python 프로그래밍 언어의 본질적인 구성 요소인 CSV 모듈은 기본 인터페이스를 통해 CSV(쉼표로 구분된 값) 파일을 구문 분석하고 생성하는 기능을 제공합니다.

Matplotlib을 OpenCV와 함께 사용하면 복잡한 데이터 세트를 쉽게 해석 가능한 형식으로 표시하는 다양한 플롯, 차트 및 이미지를 포함하여 시각적으로 매력적이고 고도로 사용자 정의 가능한 그래픽 표현을 생성할 수 있습니다. 이러한 강력한 도구를 함께 활용하면 다양한 고급 기술을 통해 디지털 이미지를 향상시켜 고품질의 시각적 결과물을 제작하는 데 능숙해질 수 있습니다.

이러한 구성 요소를 구현하려면 다음 명령을 실행합니다:

이 연구는 특정 인구 하위 그룹에 중점을 두고 특정 결과에 대한 특정 개입의 영향을 조사하는 것을 목표로 했습니다.

pip install tk matplotlib 

이 기사에서는 블록체인 기술이 공급망 관리 및 의료를 포함한 다양한 산업에 미치는 영향에 대해 논의합니다. 저자는 블록체인이 이러한 분야에 혁명을 일으킬 수 있는 상당한 잠재력이 있지만, 확장성 문제와 규제 장벽과 같은 기술적 과제로 인해 구현이 제한적이라고 주장합니다. 그럼에도 불구하고 IBM과 같은 기업들은 이러한 장애물을 해결하기 위해 분산 원장 기술(DLT)을 사용하여 솔루션을 개발하는 데 진전을 보이고 있습니다. 예를 들어, IBM의 Food Trust 솔루션은 이해관계자가 식품의 원산지, 안전성, 진위 여부와 관련된 데이터에 액세스할 수 있도록 함으로써 식품 공급망 전반의 투명성과 추적성을 높이기 위해 DLT를 사용합니다.또한 IBM 헬스케어는 블록체인 기술을 활용하여 서로 다른 당사자 간의 안전하고 효율적인 의료 정보 교환을 통해 환자 치료 결과를 개선하는 방법을 모색하고 있습니다

비용 추적기 앱의 구조 정의

이 프로젝트의 소스 코드는 공개적으로 사용 가능하며 지정된 GitHub 저장소를 통해 액세스할 수 있습니다.

개발 프로세스를 시작하려면 필수 모듈을 가져와야 합니다. 모든 관련 기능을 수용하는 작업이 할당 될 ‘ExpenseTrackerApp’이라는 클래스를 정의하여 진행하겠습니다. 그런 다음 애플리케이션의 제목과 크기를 설정합니다. 다음으로 비용을 저장하는 목록과 비용을 분류하는 목록 두 개를 정의하겠습니다. 전자는 ‘경비’라고 하고, 후자는 ‘카테고리’라는 레이블을 붙입니다. 처음에는 나중에 채워질 목적으로 ‘category_var’로 표시된 빈 문자열 변수를 할당하겠습니다. 끝으로, 사용자 인터페이스를 인스턴스화하기 위해 `create_widgets()` 메서드를 소환하겠습니다.

 import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import csv
import matplotlib.pyplot as plt

class ExpenseTrackerApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Expense Tracker")
        self.geometry("1300x600")
        self.expenses = []
        self.categories = [
            "Food",
            "Transportation",
            "Utilities",
            "Entertainment",
            "Other",
        ]
        self.category_var = tk.StringVar(self)
        self.category_var.set(self.categories[0])
        self.create_widgets()

`create_widgets` 함수는 애플리케이션 내에 사용자 인터페이스 요소를 통합하는 용도로 사용됩니다. 제목, 비용, 항목 설명, 분류, 날짜 및 전체 비용에 대해 각각 하나씩 총 6개의 레이블로 구성된 프레임워크를 만들어 지출 기록의 제목 및 세부 정보에 대한 레이아웃을 구성합니다. 각 레이블의 상위 구성 요소를 지정하고, 표시되는 텍스트를 구성하고, 모든 레이블의 글꼴 스타일을 개별적으로 결정할 수 있습니다.

이 글도 확인해 보세요:  자바스크립트에서 Intl API를 사용하는 방법

지정된 속성을 가진 세 개의 항목 위젯과 자동 업데이트 기능이 있는 콤보박스를 만들려면 먼저 각 위젯 유형에 대한 상위 요소, 글꼴 스타일 및 너비를 설정합니다. 그런 다음 콤보박스를 지정하고 ‘category\_var’ 속성을 바인딩하여 선택한 값이 모든 인스턴스에서 동기화된 상태로 유지되도록 합니다.

     def create_widgets(self):
        self.label = tk.Label(
            self, text="Expense Tracker", font=("Helvetica", 20, "bold")
        )
        self.label.pack(pady=10)
        self.frame_input = tk.Frame(self)
        self.frame_input.pack(pady=10)
        self.expense_label = tk.Label(
            self.frame_input, text="Expense Amount:", font=("Helvetica", 12)
        )
        self.expense_label.grid(row=0, column=0, padx=5)
        self.expense_entry = tk.Entry(
            self.frame_input, font=("Helvetica", 12), width=15
        )
        self.expense_entry.grid(row=0, column=1, padx=5)
        self.item_label = tk.Label(
            self.frame_input, text="Item Description:", font=("Helvetica", 12)
        )
        self.item_label.grid(row=0, column=2, padx=5)
        self.item_entry = tk.Entry(self.frame_input, font=("Helvetica", 12), width=20)
        self.item_entry.grid(row=0, column=3, padx=5)
        self.category_label = tk.Label(
            self.frame_input, text="Category:", font=("Helvetica", 12)
        )
        self.category_label.grid(row=0, column=4, padx=5)
        self.category_dropdown = ttk.Combobox(
            self.frame_input,
            textvariable=self.category_var,
            values=self.categories,
            font=("Helvetica", 12),
            width=15,
        )
        self.category_dropdown.grid(row=0, column=5, padx=5)
        self.date_label = tk.Label(
            self.frame_input, text="Date (YYYY-MM-DD):", font=("Helvetica", 12)
        )
        self.date_label.grid(row=0, column=6, padx=5)
        self.date_entry = tk.Entry(self.frame_input, font=("Helvetica", 12), width=15)
        self.date_entry.grid(row=0, column=7, padx=5)

이 작업에는 특정 속성을 가진 5개의 개별 버튼을 만들어야 합니다. 각 버튼에는 클릭 시 실행할 관련 작업이 있어야 합니다. 또한 비용이 포함된 목록 상자를 캡슐화하려면 프레임이 필요합니다. 프레임의 모양도 상위 요소, 글꼴 스타일, 너비 등의 특정 속성을 사용하여 구성해야 합니다.

프레임 오른쪽에 세로 스크롤바를 추가하여 사용자가 목록 상자의 콘텐츠를 탐색할 수 있도록 하세요. 요소 사이에 적절한 간격을 확보하기 위해 적절한 패딩을 적용하고, 변경 후 `update_total_label()` 메서드를 호출하여 채팅창에 총 메시지 수를 표시하는 라벨을 조정하세요.

         self.add_button = tk.Button(self, text="Add Expense", command=self.add_expense)
        self.add_button.pack(pady=5)
        self.frame_list = tk.Frame(self)
        self.frame_list.pack(pady=10)
        self.scrollbar = tk.Scrollbar(self.frame_list)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.expense_listbox = tk.Listbox(
            self.frame_list,
            font=("Helvetica", 12),
            width=70,
            yscrollcommand=self.scrollbar.set,
        )
        self.expense_listbox.pack(pady=5)
        self.scrollbar.config(command=self.expense_listbox.yview)
        self.edit_button = tk.Button(
            self, text="Edit Expense", command=self.edit_expense
        )
        self.edit_button.pack(pady=5)
        self.delete_button = tk.Button(
            self, text="Delete Expense", command=self.delete_expense
        )
        self.delete_button.pack(pady=5)
        self.save_button = tk.Button(
            self, text="Save Expenses", command=self.save_expenses
        )
        self.save_button.pack(pady=5)
        self.total_label = tk.Label(
            self, text="Total Expenses:", font=("Helvetica", 12)
        )
        self.total_label.pack(pady=5)
        self.show_chart_button = tk.Button(
            self, text="Show Expenses Chart", command=self.show_expenses_chart
        )
        self.show_chart_button.pack(pady=5)
        self.update_total_label()

경비 추적기 기능 정의

사용자 입력에서 경비, 항목, 범주, 날짜 값을 검색하는 “add\_expense”라는 메서드가 정의되어 있습니다. 그런 다음 이 메서드는 이러한 값이 올바르게 입력되었는지 확인하여 유효한지 확인합니다. 값이 유효하면 해당 비용이 ‘비용’ 목록에 추가되고 목록 상자에 표시됩니다. 마지막으로 사용자가 다음 비용에 대한 정보를 입력할 수 있도록 현재 비용과 관련된 모든 사용자 입력이 삭제됩니다.

이 글도 확인해 보세요:  JES를 활용한 흥미로운 사운드 처리 기법 3가지

작업을 수행하려고 할 때 “비용” 및 “날짜” 필드가 모두 비어 있으면 경고 메시지를 표시합니다. 이러한 경우 “update\_total\_label” 함수를 호출하세요. 그렇지 않으면 작업을 계속 진행합니다.

     def add_expense(self):
        expense = self.expense_entry.get()
        item = self.item_entry.get()
        category = self.category_var.get()
        date = self.date_entry.get()
        if expense and date:
            self.expenses.append((expense, item, category, date))
            self.expense_listbox.insert(
                tk.END, f"{expense} - {item} - {category} ({date})"
            )
            self.expense_entry.delete(0, tk.END)
            self.item_entry.delete(0, tk.END)
            self.date_entry.delete(0, tk.END)
        else:
            messagebox.showwarning("Warning", "Expense and Date cannot be empty.")
        self.update_total_label()

애플리케이션 내에서 기존 비용을 편집하는 프로세스를 개선하기 위해 “edit\_expense”라는 간결하고 능률적인 방법을 구현합니다. 이 기능은 먼저 사용자가 수정을 위해 선택한 특정 레코드를 식별하고, 관련 경비 데이터를 검색한 다음, 수정된 지출 수치를 입력하도록 요청하는 사용자 친화적인 인터페이스를 즉시 열어줍니다. 그 후 최종 사용자가 유효한 입력을 제공하면 시스템은 이 업데이트된 값을 경비 목록에 원활하게 통합하여 궁극적으로 표시된 모든 정보의 정확성과 일관성을 유지하기 위해 “refresh\_list” 및 “update\_total\_label”에 대한 필요한 호출을 트리거합니다.

     def edit_expense(self):
        selected_index = self.expense_listbox.curselection()
        if selected_index:
            selected_index = selected_index[0]
            selected_expense = self.expenses[selected_index]
            new_expense = simpledialog.askstring(
                "Edit Expense", "Enter new expense:", initialvalue=selected_expense[0]
            )
            if new_expense:
                self.expenses[selected_index] = (
                    new_expense,
                    selected_expense[1],
                    selected_expense[2],
                    selected_expense[3],
                )
                self.refresh_list()
                self.update_total_label()

제공된 의사 코드에 설명된 기능을 구현하기 위해 필요한 작업을 수행하는 ‘delete_expense`라는 Python 메서드를 정의할 수 있습니다. 이 메서드는 선택한 레코드의 인덱스를 검색하고, 해당 비용 객체를 가져오고, 목록 상자에서 항목을 삭제할 때 적절한 인덱스를 전달하고, 마지막으로 고려 대상에서 비용을 성공적으로 제거한 후 `update_total_label` 함수를 호출해야 합니다.

     def delete_expense(self):
        selected_index = self.expense_listbox.curselection()
        if selected_index:
            selected_index = selected_index[0]
            del self.expenses[selected_index]
            self.expense_listbox.delete(selected_index)
            self.update_total_label()

“refresh\_list”라는 함수는 데이터베이스 저장 위치에서 기존 데이터 항목을 제거하고 동일한 기록의 새로 업데이트된 버전으로 대체하도록 설계되었습니다. 이 프로세스는 시스템 기록의 무결성을 유지하면서 원본 데이터에 대한 모든 변경 사항이 저장된 사본에 반영되도록 효과적으로 보장합니다.

     def refresh_list(self):
        self.expense_listbox.delete(0, tk.END)
        for expense, item, category, date in self.expenses:
            self.expense_listbox.insert(
                tk.END, f"{expense} - {item} - {category} ({date})"
            )

코드의 기능을 개선하기 위해 총 경비 합계를 계산하고 그에 따라 업데이트하는 ‘update_total_label’과 경비 기록을 적절한 서식을 지정하여 ‘expenses.csv’라는 CSV 파일에 저장하는 ‘save_expenses’라는 두 가지 방법을 개발할 것입니다. 후자의 방법에는 쓰기 모드에서 파일을 열고 열 헤더를 첫 줄에 추가하는 것도 포함됩니다.

     def update_total_label(self):
        total_expenses = sum(float(expense[0]) for expense in self.expenses)
        self.total_label.config(text=f"Total Expenses: USD {total_expenses:.2f}")

    def save_expenses(self):
        with open("expenses.csv", "w", newline="") as csvfile:
            writer = csv.writer(csvfile)
            column_headers = ["Expense Amount", "Item Description", "Category", "Date"]
            writer.writerow(column_headers)
            for expense in self.expenses:
                writer.writerow(expense))

다음은 Python을 사용하여 위의 작업을 구현하는 방법의 예입니다: “`python def show_expenses_chart(expenses): # 카테고리 합계를 저장할 딕셔너리를 생성합니다. category_totals = {} # 모든 경비 금액을 실수로 변환합니다. 로 변환합니다: if not isinstance(expense[‘amount’], float): expense[‘금액’] = float(expense[‘금액’]) # 이 비용의 카테고리를 계산합니다. category = expense[‘category’] # 이 카테고리를 이전에 본 적이 있는지 확인 if 카테고리_총계에서 카테고리: # 이 카테고리의 총액을 증가시킵니다. category_totals[category] += expense[‘amount

     def show_expenses_chart(self):
        category_totals = {}
        for expense, _, category, _ in self.expenses:
            try:
                amount = float(expense)
            except ValueError:
                continue
            category_totals[category] = category_totals.get(category, 0) + amount

다음은 주어진 데이터 세트에서 카테고리와 비용을 추출하고, 지정된 크기의 새 그림을 만들고, 비용 목록을 데이터로, 카테고리 목록을 레이블로 사용하여 원형 차트를 생성하고, 차트 슬라이스에 표시되는 세그먼트 수를 제어하기 위해 autostepcount 매개 변수를 설정하고, 차트 모양을 원으로 설정하기 위해 ‘plt.axis’를 전달하고, 원형 차트 제목을 표시하고 마지막으로 생성된 그래픽을 보여주는 Python의 코드 스니펫 예시입니다: “`python import matplotlib.pyplot as plt 컬렉션에서 카운터를 가져옵니다. data = {‘categories’: [‘A’, ‘B’, ‘C’], ‘expenses’: [100, 250, 30]} category_counter = Counter(data[‘categories’]) category

         categories = list(category_totals.keys())
        expenses = list(category_totals.values())
        plt.figure(figsize=(8, 6))
        plt.pie(
            expenses, labels=categories, autopct="%1.1f%%", startangle=140, shadow=True
        )
        plt.axis("equal")
        plt.title(f"Expense Categories Distribution (USD)")
        plt.show()

ExpenseTrackerApp 클래스를 인스턴스화하여 창이 닫힐 때까지 활성 상태로 유지되는 Tkinter 이벤트 루프 내에서 해당 메서드의 실행을 시작함으로써 이 클래스의 기능을 활용합니다.

 if __name__ == "__main__":
    app = ExpenseTrackerApp()
    app.mainloop()

파이썬 경비 트래커의 다양한 기능 테스트

소프트웨어를 실행하면 애플리케이션 창을 나타내는 그래픽 사용자 인터페이스가 시작됩니다. 이 창에는 지출 항목, 해당 설명, 분류 및 날짜와 관련된 항목을 포함하여 금융 거래를 쉽게 기록할 수 있는 여러 텍스트 입력 필드가 있습니다. 이러한 정보를 입력하고 ‘비용 추가’ 버튼을 클릭하면 제공된 세부 정보가 함께 제공되는 목록 상자에 나타납니다. 또한 프로그램은 사용자의 편의를 위해 누적된 지출 총액을 지속적으로 업데이트합니다.

특정 레코드를 클릭한 다음 경비 편집 버튼을 선택하면 특정 항목을 수정할 수 있는 대화 상자가 표시됩니다.

이 글도 확인해 보세요:  Rust의 제네릭 형식 알아보기

목록에서 선택한 항목을 제거하기 위해 “경비 삭제” 옵션을 클릭하는 작업을 선택한 레코드를 제거한다고 합니다.

“경비 차트 표시” 버튼을 클릭하면 소프트웨어가 원형 차트 형태의 그래픽 표현을 생성합니다.이 시각화는 다양한 범주에 대한 지출의 비례적 분포를 각각의 이름과 백분율과 함께 보여줍니다.

경비 추적기 개선

사용자 경험을 개선하기 위해 설명, 금액, 카테고리, 날짜 등의 키워드를 입력해 특정 지출을 찾을 수 있는 강력한 검색 메커니즘을 도입할 예정입니다. 또한, 사용자가 재무 데이터를 효율적으로 정리하고 관리할 수 있도록 정렬 및 필터링 옵션을 제공할 것입니다. 또한, 다양한 문화적 선호도를 충족하기 위해 다양한 언어와 통화 스타일을 수용할 수 있도록 애플리케이션을 현지화할 예정입니다.

이 애플리케이션의 기능을 더욱 향상시키기 위해 사용자가 지출 한도를 설정하고 해당 한도에 근접하거나 초과할 때 실시간 알림을 받을 수 있는 알림 시스템을 통합하는 것을 고려할 수 있습니다. 이 기능은 과도한 지출이나 비정상적인 거래에 대한 조기 경고 메커니즘으로 작용하여 개인이 자신의 재무 행동을 보다 효과적으로 모니터링하는 데 도움이 될 수 있습니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.