Սովորեք Python-ի հիմունքները. Եկեք կառուցենք պարզ ծախսերի հետագծում
Եթե երբևէ փորձել եք բյուջե կազմել, ապա գիտեք, թե որքան դժվար կարող է լինել ծախսերի հետագծում ձեռք բերելը, որն անում է այն, ինչ ցանկանում եք: Բայց ինչ կասեք ինքներդ կառուցելու մասին: Եկեք սովորենք Python-ի հիմունքները՝ ստեղծելով պարզ ծախսերի հետքեր, որը դուք կարող եք իրականում օգտագործել:
Ծախսերի հետևման մեր հավելվածի պահանջների սահմանում
Երբ ես հայտնեցի այս գաղափարը, ես ուզում էի ստեղծել մի ծրագիր, որն ավելին է, քան պարզապես հրամանի տողի տերմինալի մեկ այլ հավելված: Մենք ստեղծել ենք դրանցից մի քանիսը (օրինակ՝ պարզ անելիքների ցանկը, օգտագործելով Python-ը): Այս մեկի համար ես ուզում էի օգտագործել որոշ GUI, ուստի որոշեցի, որ ներմուծենք Tkinter գրադարանը, որպեսզի ունենանք օգտագործելի UI տարրեր:
Գրադարանները մեզ թույլ են տալիս նորից օգտագործել կոդը: Սովորաբար կա գրադարան այն ամենի համար, ինչ դուք կարող եք անել Python-ում: Դրանց ներմուծումը խուսափում է զրոյից վերաշարադրել իրենց պարունակած բոլոր ծածկագրերը:
Այս հավելվածում մենք պատրաստվում ենք իրականացնել.
- Ծախսերի մուտքագրում
- Բյուջեի սահմանում
- Համեմատելով մեր ծախսերը մեր բյուջեի հետ
- Դիտեք ծախսերի պատմությունը
Այս ամենի վերջում մենք լավ պատկերացում կունենանք, թե ինչպես է աշխատում Python-ը և կկարողանանք լրացնել մեր առաջին GUI-ի վրա հիմնված Python հավելվածը:
Ստեղծելով մեր նախագիծը
Դուք պետք է ստուգեք՝ համոզվելու համար, որ ձեր սարքում տեղադրված է Python՝ ստուգելով Python տարբերակը։ Ես արդեն պատմել եմ, թե ինչպես կապել իմ սիրելի IDE-ն (Visual Studio) Python-ին: Երբ դուք հաղթահարեք ձեր սարքում Python-ը տեղադրելու և այն ընթացիկ տարբերակին թարմացնելու ծախսերը, մենք կարող ենք սկսել նոր նախագիծ ստեղծելով:
Այս նախագծի համար ես ընտրել եմ Python-ը, քանի որ այն ամենահեշտ լեզուներից մեկն է սկսնակների համար: Եկեք սուզվենք կառուցելու մեր ծախսերի հետագծիչը:
Հիմնական հավելվածի պատուհանի կառուցում
Քանի որ այս հավելվածում մենք հեռանալու ենք տերմինալից, փոխարենը պետք է կարգավորենք Tkinter-ը, որպեսզի ստեղծենք մեր հավելվածի գրաֆիկական ինտերֆեյսը (GUI): UI դիզայնը Python-ում կարող է բարդ լինել, այնպես որ ես կպահեմ այն պարզ և պարզապես կասեմ ձեզ, թե ինչ է անում այն կոդը, որը ես ձեզ եմ տալիս: Ահա թե ինչպես է սահմանվելու իմ UI պատուհանը: Մենք կսկսենք ներմուծել Tkinter:
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
Tkinter-ը ներառում է բոլոր այն գործառույթները, որոնք մեզ անհրաժեշտ են հիմնական UI ստեղծելու համար: Դուք կիմանաք, որ մենք նաև ներմուծում ենք Ttk՝ Tkinter-ի ներսում թեմատիկ շարժիչ: Սա թույլ է տալիս մեզ վերահսկել, թե ինչպես է մեր UI տեսքը, եթե ցանկանում ենք: Մենք նաև պատրաստվում ենք օգտագործել հաղորդագրությունների տուփը և պարզ երկխոսությունը՝ օգտվողին հուշելու համար նախնական բյուջեի կարգավորումը: Մենք նաև ցանկանում ենք, որ կարողանանք պահպանել ամսական տվյալները, եթե ապագայում ցանկանանք մուտք գործել դրանք, այնպես որ մենք նաև կավելացնենք մեր ֆայլի վերևում.
import json
from datetime import datetime
Բացի իմ սեփական անվանը շատ մոտ լինելուց, JSON-ն իրականում բավականին զով է որպես սերիալացման համակարգ: Բարեբախտաբար, այն գալիս է ստանդարտ Python-ի հետ, այնպես որ մենք կարող ենք ուղղակիորեն ներմուծել այն: Ամսաթվերի ներմուծումն օգնում է մեզ պահել մեր ամսաթվերը ճիշտ ձևաչափված ամբողջ հավելվածում:
Այժմ, երբ մենք պարզեցինք ներմուծումները, եկեք իրականում կառուցենք պատուհանը.
def create_widgets(self):
# Main Frame
main_frame = ttk.Frame(self.root, padding="10")
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# Expense Input Frame
input_frame = ttk.LabelFrame(main_frame, text="Add Expense", padding="10")
input_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), padx=5, pady=5)
ttk.Label(input_frame, text="Date (YYYY-MM-DD):").grid(row=0, column=0, sticky=tk.W)
self.date_entry = ttk.Entry(input_frame)
self.date_entry.grid(row=0, column=1, padx=5, pady=2)
ttk.Label(input_frame, text="Category:").grid(row=1, column=0, sticky=tk.W)
self.category_combobox = ttk.Combobox(input_frame, values=self.categories)
self.category_combobox.grid(row=1, column=1, padx=5, pady=2)
ttk.Label(input_frame, text="Amount:").grid(row=2, column=0, sticky=tk.W)
self.amount_entry = ttk.Entry(input_frame)
self.amount_entry.grid(row=2, column=1, padx=5, pady=2)
ttk.Button(input_frame, text="Add Expense", command=self.add_expense).grid(row=3, column=0, columnspan=2, pady=5)
# Category Management Frame
category_frame = ttk.LabelFrame(main_frame, text="Manage Categories", padding="10")
category_frame.grid(row=1, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), padx=5, pady=5)
self.new_category_entry = ttk.Entry(category_frame)
self.new_category_entry.grid(row=0, column=0, padx=5, pady=2)
ttk.Button(category_frame, text="Add Category", command=self.add_category).grid(row=0, column=1, padx=5, pady=2)
Այս գրառումները պարզապես ոճավորում են մեր պատուհանը: Եթե ցանկանում եք, կարող եք խաղալ թվերի հետ և տեսնել, թե ինչ եք ստանում, քանի որ դրանց հետ շփվելն անվնաս է (բացի այն, որ վերջին պատուհանը սարսափելի է թվում): Մենք նաև պետք է ցուցադրենք շրջանակը և պահպանման կոճակը և կարգավորենք ցանցն այնպես, որ այն գեղեցիկ տեսք ունենա.
# Display Frame
display_frame = ttk.LabelFrame(main_frame, text="Expenses and Budget", padding="10")
display_frame.grid(row=0, column=1, rowspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), padx=5, pady=5)
self.expense_tree = ttk.Treeview(display_frame, columns=('Date', 'Category', 'Amount'), show='headings')
self.expense_tree.heading('Date', text='Date')
self.expense_tree.heading('Category', text='Category')
self.expense_tree.heading('Amount', text='Amount')
self.expense_tree.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
scrollbar = ttk.Scrollbar(display_frame, orient=tk.VERTICAL, command=self.expense_tree.yview)
scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))
self.expense_tree.configure(yscrollcommand=scrollbar.set)
self.budget_label = ttk.Label(display_frame, text=f"Monthly Budget: ${self.monthly_budget:.2f}")
self.budget_label.grid(row=1, column=0, sticky=tk.W, pady=2)
self.total_expenses_label = ttk.Label(display_frame, text="Total Expenses: $0.00")
self.total_expenses_label.grid(row=2, column=0, sticky=tk.W, pady=2)
self.remaining_budget_label = ttk.Label(display_frame, text=f"Remaining Budget: ${self.monthly_budget:.2f}")
self.remaining_budget_label.grid(row=3, column=0, sticky=tk.W, pady=2)
# Save Button
ttk.Button(display_frame, text="Save Data", command=self.save_data).grid(row=4, column=0, pady=10)
# Configure grid
self.root.columnconfigure(0, weight=1)
self.root.rowconfigure(0, weight=1)
main_frame.columnconfigure(1, weight=1)
main_frame.rowconfigure(0, weight=1)
display_frame.columnconfigure(0, weight=1)
display_frame.rowconfigure(0, weight=1)
Ինչպես տեսնում եք, UI-ն պահանջում է շատ կոդավորում՝ ճիշտ հասնելու համար: Այնուամենայնիվ, քանի որ դուք պլանավորում եք սովորել Python-ի հիմունքները, UI դիզայնը հասկանալը ամբողջի մի մասն է: Այժմ, երբ մենք գործարկեցինք UI-ը, եկեք սկսենք աշխատել ֆունկցիոնալության վրա:
Կատեգորիաների սահմանում և ծախսերի ավելացում
Մեր հավելվածին մի փոքր «մարմին» տալու համար ես նախապես սահմանեցի ծախսերի մի քանի կատեգորիա: Ես ներառեցի դրանք որպես վերնագրեր մեր մնացած սահմանումների հետ միասին.
class ExpenseTrackerApp:
def __init__(self, root):
self.root = root
self.root.title("Expense Tracker & Budget Planner")
self.root.geometry("1100x500")
self.expenses = []
self.categories = ["Rent", "Food", "Entertainment", "Car", "Credit Cards"]
self.monthly_budget = self.get_initial_budget()
self.create_widgets()
def get_initial_budget(self):
while True:
budget = simpledialog.askfloat("Monthly Budget", "Enter your monthly budget:", minvalue=0.01)
if budget is not None:
return budget
else:
if messagebox.askyesno("No Budget", "You haven't entered a budget. Do you want to exit?"):
self.root.quit()
return 0
Նման սահմանումները պետք է լինեն մեր ծրագրի վերևում: Այդ նպատակով այս հատվածը պետք է առաջ գա վիջեթի ստեղծման կոդը, որը մենք արդեն մշակել ենք:
Get_initial_budget(self) ֆունկցիան հավելվածի գործարկման սկզբում ստեղծում է թռուցիկ՝ տվյալներ հավաքելու համար, որոնք որոշում են ձեր հասանելի գումարի չափը: Արժեք մուտքագրելու ձախողումը հանգեցնում է նրան, որ հավելվածն անմիջապես կանջատվի:
Մեզ պետք է նաև ֆունկցիոնալություն՝ ծախսերը ավելացնելու և կատեգորիաները նոր, մաքսայինով թարմացնելու համար: Բարեբախտաբար, սա նույնպես հեշտ է իրականացնել.
def add_expense(self):
try:
date = self.date_entry.get()
category = self.category_combobox.get()
amount = float(self.amount_entry.get())
self.expenses.append({
'date': date,
'category': category,
'amount': amount
})
self.update_expense_list()
self.update_budget_info()
self.clear_input_fields()
except ValueError:
messagebox.showerror("Error", "Invalid input. Please check your entries.")
def add_category(self):
new_category = self.new_category_entry.get().strip()
if new_category and new_category not in self.categories:
self.categories.append(new_category)
self.category_combobox['values'] = self.categories
self.new_category_entry.delete(0, tk.END)
messagebox.showinfo("Category Added", f"'{new_category}' has been added to the categories.")
else:
messagebox.showerror("Error", "Invalid category name or category already exists.")
Մեր հիմնական ֆունկցիոնալությունը լրացնելու համար մեզ անհրաժեշտ կլինեն գործառույթներ՝ ծախսերի ցանկը թարմացնելու համար, երբ մուտքագրենք նոր ծախս: Մեզ անհրաժեշտ կլինի օգնական ֆունկցիա՝ տվյալները մուտքագրելուց հետո կոմբինատը մաքրելու համար: Եվ վերջապես, մենք պետք է հաշվարկենք, թե մեր բյուջեի որքան մասն ունենք դեռ հասանելի: Կոդի այս պարզ հատվածը մեզ թույլ կտա դա անել.
def update_expense_list(self):
for item in self.expense_tree.get_children():
self.expense_tree.delete(item)
for expense in self.expenses:
self.expense_tree.insert('', 'end', values=(
expense['date'],
expense['category'],
f"${expense['amount']:.2f}"
))
def update_budget_info(self):
total_expenses = sum(expense['amount'] for expense in self.expenses)
remaining_budget = self.monthly_budget - total_expenses
self.total_expenses_label.config(text=f"Total Expenses: ${total_expenses:.2f}")
self.remaining_budget_label.config(text=f"Remaining Budget: ${remaining_budget:.2f}")
def clear_input_fields(self):
self.date_entry.delete(0, tk.END)
self.category_combobox.set('')
self.amount_entry.delete(0, tk.END)
Այսպիսով, այս բոլոր տվյալները մուտքագրելուց հետո ինչպե՞ս ապահովենք, որ դրանք չկորցնենք: Ես իրականացրել եմ մի պարզ պահպանման գործառույթ՝ օգտագործելով JSON ձևաչափը, որը մենք ներմուծել ենք ավելի վաղ.
def save_data(self):
data = {
'budget': self.monthly_budget,
'categories': self.categories,
'expenses': self.expenses
}
# Get the current date to use in the filename
current_date = datetime.now().strftime("%Y-%m")
default_filename = f"expense_data_{current_date}.json"
file_path = filedialog.asksaveasfilename(
defaultextension=".json",
filetypes=[("JSON files", "*.json")],
initialfile=default_filename
)
if file_path:
with open(file_path, 'w') as f:
json.dump(data, f, indent=2)
messagebox.showinfo("Save Successful", f"Data saved to {file_path}")
Այս գործառույթը սերիականացնում է տվյալները և պահում դրանք որոշակի ֆայլի վայրում՝ ֆայլի անվանը կցված ընթացիկ ամսաթվով: Վերջին բանը, որ մենք պետք է անենք, հիմնական() ֆունկցիայի հանգույցը հավաքելն է.
if __name__ == "__main__":
root = tk.Tk()
app = ExpenseTrackerApp(root)
root.mainloop()
Դա պետք է թույլ տա մեր ծախսերի հետագծողին աշխատել առանց որևէ խնդիրների: Շնորհավորում ենք Python-ում ձեր առաջին GUI-ի վրա հիմնված հավելվածն ավարտելու կապակցությամբ:
Հավելումներ, թերություններ և հարմարեցում
Սա ավարտելուց հետո դուք մի փոքր հասկանում եք, թե ինչպես է աշխատում Tkinter-ը և ինչպես կարող եք օգտագործել այն GUI-ի ստեղծման համար: Եթե դուք գիտեք մի քիչ CSS կամ գրաֆիկական դիզայն, դուք պետք է կարողանաք պարզել, թե ինչպես արագ օգտագործել Tkinter-ը: Եթե ցանկանում եք մի քանի մարտահրավերներ, կարող եք փորձել հետևյալ բաները հաջորդիվ.
- Ստեղծեք կամ օգտագործեք նոր թեմա ձեր հավելվածի համար:
- Ստեղծեք «բեռնման» գործառույթ և կոճակ դրա համար: Ես հատուկ բաց թողեցի բեռնման գործառույթը, որպեսզի ձեզ ավելի շատ տեղ տամ ուսումնասիրելու համար:
- Բացահայտեք, թե ինչպես կարող եք կատարել ձեր բյուջեի գրաֆիկական բաշխումը որպես կարկանդակ գծապատկեր:
Վերջնական հայտը ներկայումս պետք է նման լինի հետևյալին.
Ո՞ւր գնալ այստեղից:
Զարգացման այս ձեռնարկը ձեզ տվեց միայն Tkinter-ի լայն ակնարկ, բայց եթե դուք պլանավորում եք ավելի շատ GUI-ի վրա հիմնված հավելվածներ ստեղծել, դուք պետք է ավելի լավ պատկերացնեք այն, ինչ այն կարող է անել: RealPython-ը կարող է ձեզ պատկերացում տալ, թե ինչպես օգտագործել Tkinter-ը կամ ցանկացած այլ հասանելի GUI շրջանակներ կամ գործիքակազմեր: Python-ը բավականին հեշտ է հասկանալ բազային մակարդակում, բայց այնքան շատ բան կա, որ դուք կարող եք ուսումնասիրել Python-ի հիմունքները սովորելիս: Միակ բանը, որը սահմանափակում է այն, ինչ կարող ես ստեղծել, քո երևակայությունն է:
Եթե դուք խրված եք կոդի վրա և ցանկանում եք, որ իմ Python-ի ամբողջական սցենարը համեմատվի ձերի հետ, այն հասանելի է իմ GitHub-ում: