Matematik programlamanızı geliştirmek ve GUI kodlaması hakkında biraz bilgi edinmek için bu basit uygulamayı oluşturun.

Gider izleyici, bireylerin ve işletmelerin finansal işlemlerini yönetmelerine yardımcı olan önemli bir araçtır. Gider izleyiciyle bütçeler oluşturabilir, giderleri kategorilere ayırabilir ve harcama modellerini analiz edebilirsiniz.

Python'da platformlar arası GUI'ye sahip bir gider takip uygulamasının nasıl oluşturulacağını öğrenin.

Tkinter, CSV ve Matplotlib Modülleri

Bu gider izleyiciyi oluşturmak için Tkinter, CSV ve Matplotlib modüllerine ihtiyacınız olacak.

Tkinter size izin veriyor masaüstü uygulamaları oluşturun. Uygulama geliştirmeyi kolaylaştıran düğmeler, etiketler ve metin kutuları gibi çeşitli widget'lar sunar.

CSV modülü, okuma ve yazma işlevselliği sağlayan yerleşik bir Python kitaplığıdır. CSV (Virgülle Ayrılmış Değerler) dosyaları.

Matplotlib ile grafikler, grafikler ve çizelgeler gibi etkileşimli görselleştirmeler oluşturabilirsiniz. OpenCV gibi modüllerle kullanmak size yardımcı olabilir ana görüntü iyileştirme teknikleri fazla.

instagram viewer

Bu modülleri yüklemek için şunu çalıştırın:

pip install tk matplotlib 

Gider Takibi Uygulamasının Yapısını Tanımlayın

Bu projenin kaynak kodunu kendi içinde bulabilirsiniz. GitHub deposu.

Gerekli modülleri içe aktararak başlayın. Bir sınıf tanımlayın, Gider Takip Uygulaması. Başlığı ve boyutları ayarlayın. Harcamaları saklamak için bir liste ve kategoriler için başka bir liste tanımlayın. Bir başlat StringVar adlandırılmış kategori_var ve başlangıç ​​değerini kategoriler listesindeki ilk kategoriye ayarlayın. numaralı telefonu arayarak işleminizi tamamlayın. create_widget'lar yöntem.

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

classExpenseTrackerApp(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_widget'lar yöntem, uygulamanıza UI bileşenleri eklemekten sorumludur. Gider kaydının etiketleri ve girişleri için bir çerçeve oluşturun. Altı etiket oluşturun: başlık, gider tutarı, öğe açıklaması, kategori, tarih ve toplam gider için birer tane. Her birinin ana öğesini, görüntülemesi gereken metni ve yazı tipi stilini ayarlayın.

Üç giriş widget'ı ve bir Açılan kutu karşılık gelen girişi almak için. Giriş widget'ları için ana öğeyi, yazı tipi stilini ve genişliğini ayarlayın. Ana öğeyi, değerler listesini, yazı tipi stilini ve genişliğini tanımlayın. Açılan kutu. Bağla kategori_var böylece seçilen değer otomatik olarak güncellenir.

defcreate_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)

Beş düğme tanımlayın: Gider Ekle, Gideri Düzenle, Gider Sil, Giderlerden Tasarruf Edin, Ve Gider Tablosunu Göster. Her birinin ana öğesini, görüntülemesi gereken metni ve tıkladığınızda çalıştıracağı komutu ayarlayın. Liste kutusu için bir çerçeve oluşturun. Ana öğeyi, yazı tipi stilini ve genişliğini ayarlayın.

Dikey bir kaydırma çubuğu oluşturun ve onu çerçevenin sağ tarafına yerleştirin. Liste kutusunun içeriğini kaydırmak için bunu kullanın. Tüm öğeleri gerekli dolgu ve çağrı ile düzenleyin 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()

Gider Takibinin İşlevselliğini Tanımlayın

Bir yöntem tanımlayın, add_expense. Giderin, kalemin, kategorinin ve tarihin değerini alın. Giderin değeri ve tarihi geçerliyse gideri gidere ekleyin. masraflar liste. Bu kaydı liste kutusuna ekleyin ve uygun şekilde biçimlendirin. Ekledikten sonra, yeni giriş için giriş kutularındaki kullanıcı girişini silin.

Aksi takdirde gider ve tarih değerlerinin boş bırakılamayacağına dair uyarı görüntüleyin. Arama update_total_label.

defadd_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()

Bir yöntem tanımlayın, edit_expense. Seçilen kaydın dizinini alın ve gideri alın. Giderin girilmesini isteyen bir iletişim kutusu açın. Kullanıcı yeni bir gider sağladıysa gider listesini buna göre değiştirin. Ara listeyi yenile Ve update_total_label.

defedit_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()

Bir yöntem tanımlayın, gider_sil. Seçilen kaydın dizinini alın ve gideri alın. Silmek istediğiniz girişin dizinini iletin. Bu girişi liste kutusundan silin ve update_total_label.

defdelete_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()

Bir yöntem tanımlayın, listeyi yenile. Mevcut kaydı silin ve bunun yerine güncellenmiş değerlere sahip yeni bir kayıt ekleyin.

defrefresh_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})"
)

Bir yöntem tanımlayın, update_total_label. Listedeki tüm harcamaların toplamını hesaplayın ve etikette güncelleyin. Başka bir yöntem tanımlayın, save_expenses. Bir oluştur ve aç CSV adlı dosya giderler.csv yazma modunda. CSV dosyasına ilk satır olarak sütun başlıklarını ekleyin. Her gider kaydını yineleyin ve bunu bir satır olarak yazın.

defupdate_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}")

defsave_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))

Bir yöntem tanımlayın, show_expenses_chart. Bir sözlük tanımlayın, kategori_toplamları. Yineleyin masraflar gider tutarını listeleyin ve değişkene dönüştürün. Her kategori için toplam gider tutarını saklayın. Kategori sözlükte zaten mevcutsa toplamı geçerli gider tutarı kadar artırın. Aksi takdirde mevcut gider tutarıyla yeni bir giriş oluşturun.

defshow_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

Kategorileri ve harcamaları iki farklı listeye çıkarın. Çizim için belirtilen boyutta yeni bir şekil oluşturun. Gider listesini veri olarak ve kategori listesini etiket olarak kullanarak bir pasta grafiği oluşturun. otomatik kontrol parametresi, grafik dilimlerinde yüzde değerlerinin görüntülenme biçimini belirtir. Geçmek eşit ile plt.ekseni Pasta grafiğini daire şeklinde çizmenizi sağlamak için. Pasta grafiğinin başlığını ayarlayın ve görüntüleyin.

 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()

Bir örneğini oluşturun Gider Takip Uygulaması sınıf. Ana döngü() işlevi Python'a Tkinter olay döngüsünü çalıştırmasını ve siz pencereyi kapatana kadar olayları dinlemesini söyler.

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

Python Gider Takibinin Farklı Özelliklerini Test Edin

Programı çalıştırdığınızda bir uygulama penceresi açılacaktır. Bu, gideri, öğe açıklamasını, kategoriyi ve tarihi kaydetmek için giriş alanlarına sahiptir. Bazı verileri girin ve Gider Ekle düğme; kaydın liste kutusuna eklendiğini göreceksiniz. Program ayrıca toplam giderleri de günceller.

Bir kayıt seçin ve Giderleri Düzenle düğme. Bireysel kaydı güncellemenizi sağlayan bir iletişim kutusu görüntülenir.

Tıklayarak Giderleri Sil Seçilen kaydı kaldırmak için düğmesine basın.

Vurulduğunda Gider Tablosunu Göster düğmesi, program bir pasta grafiği görüntüler. Pasta grafiği, her kategorinin giderini adı ve yüzdesiyle birlikte görüntüler.

Gider Takibini İyileştirme

Kullanıcıların açıklamalarına, tutarlarına, kategorilerine veya tarihlerine göre belirli harcamaları bulmalarını sağlamak için arama işlevi ekleyebilirsiniz. Kayıtları sıralamak ve filtrelemek için bir seçenek ekleyebilirsiniz. Farklı dilleri ve para birimi biçimlerini desteklemek için uygulamayı yerelleştirin.

Uygulamayı bildirim desteğiyle de genişletebilirsiniz. Kullanıcının, bütçe sınırlarını aşmasını önlemek veya olağandışı harcamaları vurgulamak için uyarılar oluşturmasına izin verin.