Bangun aplikasi sederhana ini untuk melatih pemrograman matematika Anda dan pelajari sedikit tentang pengkodean GUI selama prosesnya.
Pelacak pengeluaran adalah alat penting yang membantu individu dan bisnis mengelola transaksi keuangan mereka. Dengan pelacak pengeluaran, Anda dapat membuat anggaran, mengkategorikan pengeluaran, dan menganalisis pola pengeluaran.
Cari tahu cara membuat aplikasi pelacak pengeluaran, dengan GUI lintas platform, dengan Python.
Modul Tkinter, CSV, dan Matplotlib
Untuk membuat pelacak pengeluaran ini, Anda memerlukan modul Tkinter, CSV, dan Matplotlib.
Tkinter memungkinkan Anda membuat aplikasi desktop. Ia menawarkan berbagai widget seperti tombol, label, dan kotak teks yang memudahkan pengembangan aplikasi.
Modul CSV adalah pustaka Python bawaan yang menyediakan fungsionalitas untuk membaca dan menulis File CSV (Nilai yang Dipisahkan Koma)..
Dengan Matplotlib, Anda dapat membuat visualisasi interaktif seperti grafik, plot, dan bagan. Menggunakannya dengan modul seperti OpenCV dapat membantu Anda menguasai teknik peningkatan gambar juga.
Untuk menginstal modul ini, jalankan:
pip install tk matplotlib
Tentukan Struktur Aplikasi Pelacak Pengeluaran
Anda dapat menemukan kode sumber proyek ini di dalamnya Repositori GitHub.
Mulailah dengan mengimpor modul yang diperlukan. Tentukan kelas, Aplikasi Pelacak Pengeluaran. Tetapkan judul dan dimensi. Tentukan daftar untuk menyimpan pengeluaran dan satu lagi untuk kategori. Inisialisasi a StringVar bernama kategori_var dan atur nilai awalnya ke kategori pertama dalam daftar kategori. Selesaikan dengan menelepon buat_widget metode.
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()
Itu buat_widget metode bertanggung jawab untuk menambahkan komponen UI ke aplikasi Anda. Buat bingkai untuk label dan entri catatan pengeluaran. Buat enam label: masing-masing satu untuk judul, jumlah pengeluaran, deskripsi barang, kategori, tanggal, dan total pengeluaran. Tetapkan elemen induk masing-masing, teks yang harus ditampilkan, dan gaya fontnya.
Buat tiga widget entri dan a Kotak kombo untuk mendapatkan masukan yang sesuai. Untuk widget entri, atur elemen induk, gaya font, dan lebar. Tentukan elemen induk, daftar nilai, gaya font, dan lebar untuk Kotak kombo. Mengikat kategori_var ke sana, sehingga nilai yang dipilih diperbarui secara otomatis.
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)
Tentukan lima tombol: Tambahkan Biaya, Sunting Biaya, Hapus Biaya, Menghemat Biaya, Dan Tampilkan Bagan Pengeluaran. Tetapkan elemen induk masing-masing, teks yang harus ditampilkan, dan perintah yang akan dijalankan saat Anda mengkliknya. Buat bingkai untuk kotak daftar. Atur elemen induk, gaya font, dan lebarnya.
Buat bilah gulir vertikal dan letakkan di sisi kanan bingkai. Gunakan untuk menelusuri isi kotak daftar. Atur semua elemen dengan padding dan panggilan yang diperlukan perbarui_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()
Tentukan Fungsi Pelacak Pengeluaran
Tentukan metode, tambahkan_biaya. Ambil nilai pengeluaran, item, kategori, dan tanggal. Jika nilai pengeluaran dan tanggalnya benar, tambahkan biaya tersebut ke dalam pengeluaran daftar. Masukkan catatan ini ke dalam kotak daftar dan format dengan benar. Setelah dimasukkan, hapus masukan pengguna di kotak entri untuk masukan baru.
Jika tidak, tampilkan peringatan bahwa nilai pengeluaran dan tanggal tidak boleh kosong. Panggilan perbarui_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()
Tentukan metode, edit_biaya. Ambil indeks dari catatan yang dipilih dan dapatkan biayanya. Buka kotak dialog yang meminta untuk memasukkan biaya. Jika pengguna memberikan pengeluaran baru, ubah daftar pengeluaran sesuai dengan itu. Hubungi segarkan_daftar Dan perbarui_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()
Tentukan metode, hapus_biaya. Ambil indeks dari catatan yang dipilih dan dapatkan biayanya. Berikan indeks entri yang ingin Anda hapus. Hapus entri itu dari kotak daftar dan panggil perbarui_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()
Tentukan metode, segarkan_daftar. Hapus catatan yang ada dan tambahkan catatan baru dengan nilai yang diperbarui.
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})"
)
Tentukan metode, perbarui_total_label. Hitung jumlah semua pengeluaran dalam daftar dan perbarui pada label. Tentukan metode lain, simpan_biaya. Buat dan buka a CSV nama file pengeluaran.csv dalam mode tulis. Tambahkan header kolom ke file CSV sebagai baris pertama. Ulangi setiap catatan pengeluaran, dan tuliskan sebagai satu baris.
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))
Tentukan metode, tampilkan_biaya_bagan. Definisikan kamus, kategori_total. Ulangi melalui pengeluaran daftar dan ubah jumlah pengeluaran menjadi mengambang. Simpan jumlah total pengeluaran untuk setiap kategori. Jika kategori tersebut sudah ada di kamus, tambahkan totalnya dengan jumlah pengeluaran saat ini. Jika tidak, buatlah entri baru dengan jumlah pengeluaran saat ini.
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
Ekstrak kategori dan pengeluaran ke dalam dua daftar berbeda. Buat gambar baru untuk plot dengan ukuran yang ditentukan. Buat diagram lingkaran, menggunakan daftar pengeluaran sebagai data dan daftar kategori sebagai label. Itu hasil otomatis parameter menentukan format untuk menampilkan nilai persentase pada irisan grafik. Lulus setara ke plt.axis untuk memastikan bahwa Anda menggambar diagram lingkaran sebagai lingkaran. Tetapkan judul diagram lingkaran dan tampilkan.
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()
Buat sebuah instance dari Aplikasi Pelacak Pengeluaran kelas. Itu loop utama() fungsi memberitahu Python untuk menjalankan loop acara Tkinter dan mendengarkan acara sampai Anda menutup jendela.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Uji Berbagai Fitur Pelacak Pengeluaran Python
Saat Anda menjalankan program, itu akan meluncurkan jendela aplikasi. Ini memiliki kolom input untuk mencatat pengeluaran, deskripsi barang, kategori, dan tanggal. Masukkan beberapa data dan klik Tambahkan Biaya tombol; Anda akan melihat rekaman ditambahkan ke kotak daftar. Program ini juga memperbarui total pengeluaran.
Pilih rekaman dan klik Sunting Pengeluaran tombol. Kotak dialog muncul, memungkinkan Anda memperbarui catatan individual.
Mengklik Hapus Biaya tombol untuk menghapus rekaman yang dipilih.
Saat memukul Tampilkan Bagan Pengeluaran tombol, program menampilkan diagram lingkaran. Diagram lingkaran menampilkan pengeluaran untuk setiap kategori beserta nama dan persentasenya.
Meningkatkan Pelacak Pengeluaran
Anda dapat menambahkan fungsi pencarian agar pengguna dapat menemukan pengeluaran spesifik berdasarkan deskripsi, jumlah, kategori, atau tanggal. Anda dapat menambahkan opsi untuk mengurutkan dan memfilter rekaman. Lokalkan aplikasi untuk mendukung berbagai bahasa dan format mata uang.
Anda juga dapat memperluas aplikasi dengan dukungan notifikasi. Biarkan pengguna mengatur peringatan untuk mencegah mereka melebihi batas anggaran atau menyoroti pembelanjaan yang tidak biasa.