آشنایی با Tkinter؛ ساخت یک پروژه کوچک و قابل نصب روی ویندوز

مسعود شیری 1405/07/25 ۱۲ بازدید هوش مصنوعی

در این مقاله، یک اپلیکیشن ساده اما کامل انبارداری را با استفاده از Tkinter (کتابخانه گرافیکی استاندارد پایتون) و SQLite (پایگاه داده سبک و بدون نیاز به نصب) می‌سازیم. هدف این است که نه تنها کدها را بنویسیم، بلکه تمام مراحل را از ایجاد محیط مجازی تا تولید فایل اجرایی .exe برای ویندوز طی کنیم. در پایان، یک برنامه کاربردی خواهید داشت که می‌تواند محصولات را اضافه، مشاهده، جستجو و حذف کند و داده‌ها را به‌صورت دائمی ذخیره نماید.

۱. Tkinter چیست و چرا از آن استفاده می‌کنیم؟

Tkinter یک لایه شیءگرا و نازک روی جعبه‌ابزار Tcl/Tk است که به‌صورت پیش‌فرض همراه با پایتون نصب می‌شود . این بدان معناست که برای ساخت رابط گرافیکی کاربر (GUI) نیازی به نصب کتابخانه اضافی ندارید و برنامه شما روی هر سیستمی که پایتون دارد، اجرا خواهد شد. مزیت اصلی Tkinter سادگی و سرعت بالای آن است؛ اگرچه ظاهر پیش‌فرض آن کمی قدیمی به نظر می‌رسد، اما با استفاده از ماژول ttk می‌توان ظاهری مدرن‌تر به برنامه داد .

برای ذخیره‌سازی داده‌ها نیز از SQLite استفاده می‌کنیم که یک پایگاه داده رابطه‌ای سبک است و به‌صورت داخلی در پایتون پشتیبانی می‌شود. برخلاف MySQL یا PostgreSQL، SQLite نیازی به سرور جداگانه ندارد و تمام داده‌ها در یک فایل ساده ذخیره می‌شوند . این ویژگی آن را برای اپلیکیشن‌های دسکتاپ کوچک و متوسط ایده‌آل می‌کند.

۲. گام اول: ایجاد محیط مجازی (venv)

قبل از نوشتن هر کدی، بهترین کار این است که یک محیط مجازی برای پروژه خود بسازید. این کار باعث می‌شود کتابخانه‌هایی که نصب می‌کنید، با کتابخانه‌های سیستمی و سایر پروژه‌های شما تداخل نداشته باشند .

در ویندوز، پوشه‌ای برای پروژه خود ایجاد کنید (مثلاً warehouse_app)، سپس در ترمینال (Command Prompt یا PowerShell) وارد آن پوشه شوید و دستور زیر را اجرا کنید:

py -m venv .venv

این دستور یک پوشه مخفی به نام .venv ایجاد می‌کند که شامل یک نسخه ایزوله از پایتون و pip است. برای فعال‌سازی آن در ویندوز، دستور زیر را اجرا کنید:

.venv\Scripts\activate

پس از فعال‌سازی، نام محیط مجازی در ابتدای خط فرمان شما نمایش داده می‌شود. حالا هر کتابخانه‌ای که نصب کنید، فقط در همین محیط موجود خواهد بود. برای غیرفعال‌سازی نیز کافی است دستور deactivate را تایپ کنید .

۳. نصب کتابخانه‌های ضروری

خوشبختانه برای این پروژه، هیچ کتابخانه خارجی‌ای نیاز نیست! Tkinter و SQLite هر دو بخشی از کتابخانه استاندارد پایتون هستند. تنها کتابخانه‌ای که در ادامه برای ساخت فایل .exe نیاز خواهید داشت، PyInstaller است که در بخش پایانی نصب خواهیم کرد. بنابراین فعلاً نیازی به اجرای دستور pip install ندارید و می‌توانید مستقیماً وارد بخش کدنویسی شوید.

۴. کدنویسی اپلیکیشن انبارداری

حالا فایل اصلی برنامه را با نام warehouse.py ایجاد کنید و کدهای زیر را در آن بنویسید. این کد شامل تمام قابلیت‌های اصلی یک انبارداری ساده است: افزودن محصول، نمایش لیست، جستجو و حذف.

import tkinter as tk from tkinter import ttk, messagebox import sqlite3 # --- اتصال به پایگاه داده --- conn = sqlite3.connect("warehouse.db") cursor = conn.cursor() # ایجاد جدول در صورت عدم وجود cursor.execute(""" CREATE TABLE IF NOT EXISTS products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, quantity INTEGER NOT NULL, price REAL NOT NULL ) """) conn.commit() # --- توابع عملیاتی --- def add_product(): name = entry_name.get().strip() quantity = entry_quantity.get().strip() price = entry_price.get().strip() if not name or not quantity or not price: messagebox.showerror("خطا", "همه فیلدها الزامی هستند.") return try: quantity = int(quantity) price = float(price) except ValueError: messagebox.showerror("خطا", "تعداد باید عدد صحیح و قیمت باید عدد باشد.") return cursor.execute( "INSERT INTO products (name, quantity, price) VALUES (?, ?, ?)", (name, quantity, price) ) conn.commit() messagebox.showinfo("موفق", "محصول اضافه شد.") clear_entries() refresh_table() def refresh_table(): for row in tree.get_children(): tree.delete(row) cursor.execute("SELECT * FROM products") for row in cursor.fetchall(): tree.insert("", tk.END, values=row) def delete_product(): selected = tree.selection() if not selected: messagebox.showerror("خطا", "یک محصول را انتخاب کنید.") return confirm = messagebox.askyesno("تایید", "آیا از حذف مطمئن هستید؟") if confirm: for item in selected: product_id = tree.item(item)["values"][0] cursor.execute("DELETE FROM products WHERE id = ?", (product_id,)) conn.commit() refresh_table() def search_product(): query = entry_search.get().strip() for row in tree.get_children(): tree.delete(row) cursor.execute("SELECT * FROM products WHERE name LIKE ?", (f"%{query}%",)) for row in cursor.fetchall(): tree.insert("", tk.END, values=row) def clear_entries(): entry_name.delete(0, tk.END) entry_quantity.delete(0, tk.END) entry_price.delete(0, tk.END) # --- رابط گرافیکی --- root = tk.Tk() root.title("سیستم مدیریت انبار") root.geometry("700x500") # فریم ورودی‌ها frame_input = ttk.LabelFrame(root, text="افزودن محصول جدید", padding=10) frame_input.pack(fill="x", padx=10, pady=5) ttk.Label(frame_input, text="نام محصول:").grid(row=0, column=0, padx=5, pady=5, sticky="e") entry_name = ttk.Entry(frame_input, width=30) entry_name.grid(row=0, column=1, padx=5, pady=5) ttk.Label(frame_input, text="تعداد:").grid(row=0, column=2, padx=5, pady=5, sticky="e") entry_quantity = ttk.Entry(frame_input, width=15) entry_quantity.grid(row=0, column=3, padx=5, pady=5) ttk.Label(frame_input, text="قیمت:").grid(row=1, column=0, padx=5, pady=5, sticky="e") entry_price = ttk.Entry(frame_input, width=30) entry_price.grid(row=1, column=1, padx=5, pady=5) btn_add = ttk.Button(frame_input, text="افزودن", command=add_product) btn_add.grid(row=1, column=2, columnspan=2, pady=5) # فریم جستجو و حذف frame_action = ttk.Frame(root, padding=10) frame_action.pack(fill="x", padx=10) ttk.Label(frame_action, text="جستجو:").pack(side="right", padx=5) entry_search = ttk.Entry(frame_action, width=25) entry_search.pack(side="right", padx=5) btn_search = ttk.Button(frame_action, text="جستجو", command=search_product) btn_search.pack(side="right", padx=5) btn_delete = ttk.Button(frame_action, text="حذف انتخاب‌شده", command=delete_product) btn_delete.pack(side="left", padx=5) # جدول نمایش محصولات frame_table = ttk.Frame(root, padding=10) frame_table.pack(fill="both", expand=True, padx=10, pady=5) columns = ("id", "name", "quantity", "price") tree = ttk.Treeview(frame_table, columns=columns, show="headings") tree.heading("id", text="کد") tree.heading("name", text="نام محصول") tree.heading("quantity", text="تعداد") tree.heading("price", text="قیمت (تومان)") tree.column("id", width=50, anchor="center") tree.column("name", width=200, anchor="center") tree.column("quantity", width=100, anchor="center") tree.column("price", width=150, anchor="center") scrollbar = ttk.Scrollbar(frame_table, orient="vertical", command=tree.yview) tree.configure(yscrollcommand=scrollbar.set) tree.pack(side="right", fill="both", expand=True) scrollbar.pack(side="left", fill="y") refresh_table() root.mainloop()

۵. توضیح بخش‌های کلیدی کد

در بخش اول کد، با استفاده از sqlite3.connect("warehouse.db") یک فایل پایگاه داده در کنار فایل برنامه ایجاد می‌شود. سپس با دستور CREATE TABLE IF NOT EXISTS جدولی به نام products ساخته می‌شود که شامل شناسه یکتا، نام، تعداد و قیمت است. این ساختار دقیقاً مشابه الگویی است که در پروژه‌های واقعی انبارداری استفاده می‌شود .

توابع عملیاتی مانند add_product با دریافت مقادیر از ورودی‌ها، ابتدا اعتبارسنجی ساده انجام می‌دهند (مثلاً تعداد باید عدد باشد) و سپس با یک دستور INSERT داده را در جدول ذخیره می‌کنند. تابع refresh_table نیز با پاک کردن جدول نمایشی و اجرای مجدد SELECT، لیست را به‌روز می‌کند. برای جستجو از شرط LIKE استفاده شده تا کاربر بتواند بخشی از نام محصول را وارد کند .

بخش رابط گرافیکی با استفاده از ttk (نسخه مدرن‌تر Tkinter) ساخته شده است. از LabelFrame برای گروه‌بندی فیلدهای ورودی، از Treeview برای نمایش جدولی داده‌ها و از messagebox برای نمایش پیام‌های خطا و موفقیت استفاده شده است . نکته مهم این است که در پایان تابع add_product، پس از هر تغییر، تابع refresh_table فراخوانی می‌شود تا جدول همیشه به‌روز باشد.

۶. خروجی گرفتن برای ویندوز (ساخت فایل EXE)

حالا که برنامه کار می‌کند، نوبت به تبدیل آن به یک فایل اجرایی .exe می‌رسد تا کاربران بدون نیاز به نصب پایتون بتوانند از آن استفاده کنند. برای این کار از PyInstaller استفاده می‌کنیم که برنامه و تمام وابستگی‌هایش را در یک بسته مستقل قرار می‌دهد .

ابتدا مطمئن شوید که محیط مجازی فعال است (نام (.venv) در ترمینال دیده می‌شود). سپس PyInstaller را نصب کنید:

pip install pyinstaller

سپس در همان پوشه‌ای که فایل warehouse.py قرار دارد، دستور زیر را اجرا کنید:

pyinstaller --onefile --windowed --name "WarehouseApp" warehouse.py

در این دستور، --onefile باعث می‌شود همه‌چیز در یک فایل .exe واحد قرار بگیرد، --windowed از باز شدن پنجره سیاه کنسول جلوگیری می‌کند (چون برنامه ما گرافیکی است) و --name نام فایل خروجی را مشخص می‌کند . پس از اجرای دستور، پوشه‌ای به نام dist ایجاد می‌شود که فایل WarehouseApp.exe در آن قرار دارد. این فایل را می‌توانید به هر کامپیوتر ویندوزی دیگری منتقل کنید و بدون نیاز به پایتون اجرا کنید.

نکته مهم درباره پایگاه داده: فایل warehouse.db که به‌صورت خودکار در کنار برنامه ساخته می‌شود، در کنار فایل .exe باقی می‌ماند. بنابراین داده‌های شما ذخیره می‌شوند و با هر بار اجرای برنامه، همان اطلاعات قبلی قابل مشاهده خواهند بود. اگر می‌خواهید برنامه را به کامپیوتر دیگری منتقل کنید، کافی است فایل .exe را همراه با فایل warehouse.db (در صورت وجود) کپی کنید تا داده‌های قبلی نیز منتقل شوند.

جمع‌بندی

در این مقاله، یک اپلیکیشن انبارداری کامل با Tkinter و SQLite ساختیم که می‌تواند محصولات را مدیریت کند و داده‌ها را به‌صورت دائمی ذخیره نماید. سپس با استفاده از PyInstaller آن را به یک فایل اجرایی مستقل برای ویندوز تبدیل کردیم. این پروژه پایه‌ای است که می‌توانید آن را گسترش دهید؛ مثلاً با افزودن قابلیت ویرایش محصولات، گزارش‌گیری، یا حتی اضافه کردن سیستم ورود با رمز عبور. Tkinter با وجود سادگی، برای ساخت ابزارهای کاربردی و سریع، انتخابی هوشمندانه و کم‌دردسر است.


نظرات (۰)

برای ثبت نظر وارد شوید.

هنوز نظری ثبت نشده است.