0%
در حال بارگذاری...

جستجو در سایت

درس ۲ سطح متوسط: ساخت رابط کاربری گرافیکی (GUI) با tkinter در پایتون

پایتون | Python متوسط

تبریک دوباره! تو حالا یه برنامه‌نویس متوسط پایتون هستی و آماده‌ای که برنامه‌هات رو از خط فرمان به دنیای زیبا و رنگارنگ **رابط کاربری گرافیکی** ببری! برنامه‌هایی مثل ماشین حساب، تقویم، یا حتی یه چت‌باکس ساده که کاربر با کلیک و تایپ با‌شون کار می‌کنه. تو این درس، من بهت یاد می‌دم چطور با کتابخانه قدرتمند و استاندارد پایتون یعنی **tkinter** برنامه‌های دسکتاپ واقعی بسازی. اگه هنوز درس‌های مبتدی (مخصوصاً درس ۷ شیءگرایی و درس ۱۰ مدیریت پروژه) رو کامل ندیدی، یه مرور سریع بکن تا این درس برات مثل آب خوردن باشه! آماده‌ای که کاربرهات عاشق برنامه‌هات بشن؟ بریم شروع کنیم!

tkinter چیه و چرا باید یادش بگیری؟

tkinter (مخفف Tk interface) کتابخانه استاندارد پایتون برای ساخت رابط کاربری گرافیکیه. یعنی بدون نصب چیز اضافه (فقط پایتون داشته باشی کافیه!) می‌تونی پنجره، دکمه، ورودی متن، لیست و خیلی چیزای دیگه بسازی. مزایاش:

  • کاملاً رایگان و همراه پایتونه
  • ساده و سریع برای یادگیری
  • برای پروژه‌های کوچک تا متوسط عالیه
  • روی ویندوز، مک و لینوکس کار می‌کنه

بیا اولین پنجره رو بسازیم:

import tkinter as tk

root = tk.Tk()
root.title("اولین برنامه من!")
root.geometry("400x300")
root.mainloop()

اجراش کن و ببین یه پنجره خالی باز می‌شه!

ویجت‌های اصلی tkinter

ویجت (Widget) یعنی هر چیزی که تو پنجره می‌بینی: دکمه، برچسب، ورودی متن و …

ویجت کاربرد مثال کد
Label نمایش متن یا عکس tk.Label(text="سلام دنیا!")
Button دکمه قابل کلیک tk.Button(text="کلیک کن", command=hello)
Entry ورودی تک‌خطی متن tk.Entry()
Text ورودی چندخطی tk.Text()
Listbox لیست قابل انتخاب tk.Listbox()

چیدمان ویجت‌ها (Layout)

سه روش اصلی برای چیدن ویجت‌ها داریم:

  • pack() → از بالا به پایین یا چپ به راست
  • grid() → جدولی (مثل اکسل)
  • place() → با مختصات دقیق

مثال با grid():

import tkinter as tk

root = tk.Tk()
root.title("ورودی نام")

tk.Label(root, text="اسم شما:").grid(row=0, column=0)
entry = tk.Entry(root)
entry.grid(row=0, column=1)

tk.Button(root, text="سلام کن!", command=lambda: print(f"سلام {entry.get()}!")).grid(row=1, column=1)

root.mainloop()

اتصال توابع به دکمه‌ها

هر دکمه می‌تونه یه تابع رو اجرا کنه:

def say_hello():
    name = entry.get()
    label.config(text=f"سلام {name} عزیز!")

tk.Button(root, text="بگو سلام", command=say_hello).pack()

مثال‌های عملی: برنامه‌های واقعی بسازیم!

۱. ماشین حساب ساده:

import tkinter as tk

def calculate():
    try:
        result = eval(entry.get())
        label.config(text=f"نتیجه: {result}")
    except:
        label.config(text="خطا!")

root = tk.Tk()
root.title("ماشین حساب")

entry = tk.Entry(root, width=30)
entry.pack(pady=10)

tk.Button(root, text="محاسبه کن", command=calculate).pack()
label = tk.Label(root, text="نتیجه اینجا میاد")
label.pack(pady=10)

root.mainloop()

۲. لیست وظایف (To-Do List):

import tkinter as tk
from tkinter import messagebox

tasks = []

def add_task():
    task = entry.get()
    if task:
        tasks.append(task)
        listbox.insert(tk.END, task)
        entry.delete(0, tk.END)
    else:
        messagebox.showwarning("خطا", "وظیفه نمی‌تونه خالی باشه!")

def delete_task():
    try:
        index = listbox.curselection()[0]
        listbox.delete(index)
        tasks.pop(index)
    except:
        messagebox.showwarning("خطا", "اول یه وظیفه انتخاب کن!")

root = tk.Tk()
root.title("لیست وظایف من")

entry = tk.Entry(root, width=40)
entry.pack(pady=10)

tk.Button(root, text="اضافه کن", command=add_task).pack()
tk.Button(root, text="حذف کن", command=delete_task).pack(pady=5)

listbox = tk.Listbox(root, width=50, height=10)
listbox.pack(pady=10)

root.mainloop()

خطاهای رایج و راه‌حل‌ها

خطا علت راه‌حل
TclError چندبار mainloop() زدی فقط یه بار root.mainloop() بزن
ویجت نمایش داده نمی‌شه فراموش کردی pack/grid/place کنی هر ویجت باید چیدمان داشته باشه
متغیر پیدا نمی‌شه از lambda یا global استفاده نکردی برای دسترسی به ویجت‌ها از lambda استفاده کن

تمرین‌ها: دستت رو راه بنداز!

  1. یه پنجره بساز که اسم و فامیل بگیره و سلام کنه
  2. ماشین حساب کامل با + – * / بساز
  3. برنامه‌ای که دو عدد بگیره و جمعشون رو نشون بده
  4. لیست خرید با امکان اضافه/حذف
  5. برنامه تبدیل دما (سانتی‌گراد به فارنهایت)
  6. تایمر ساده با دکمه شروع/توقف
  7. برنامه‌ای که رنگ پس‌زمینه رو تغییر بده
  8. فرم ثبت‌نام با چند فیلد
  9. برنامه‌ای که عکس نمایش بده (با Pillow)
  10. منوی کشویی (OptionMenu) برای انتخاب شهر
  11. پنجره با اسکرول‌بار
  12. کلاس‌محور بنویس یه GUI کامل

پروژه نهایی: دفترچه یادداشت گرافیکی

import tkinter as tk
from tkinter import filedialog, messagebox

class Notepad:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("دفترچه یادداشت من")
        self.root.geometry("800x600")

        self.text = tk.Text(self.root, undo=True)
        self.text.pack(expand=True, fill='both')

        menu = tk.Menu(self.root)
        self.root.config(menu=menu)

        file_menu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="فایل", menu=file_menu)
        file_menu.add_command(label="جدید", command=self.new_file)
        file_menu.add_command(label="باز کردن", command=self.open_file)
        file_menu.add_command(label="ذخیره", command=self.save_file)
        file_menu.add_separator()
        file_menu.add_command(label="خروج", command=self.root.quit)

    def new_file(self):
        self.text.delete(1.0, tk.END)
        self.root.title("دفترچه یادداشت من - جدید")

    def open_file(self):
        file = filedialog.askopenfilename()
        if file:
            with open(file, "r", encoding="utf-8") as f:
                self.text.delete(1.0, tk.END)
                self.text.insert(tk.END, f.read())
            self.root.title(f"دفترچه یادداشت - {file}")

    def save_file(self):
        file = filedialog.asksaveasfilename(defaultextension=".txt")
        if file:
            with open(file, "w", encoding="utf-8") as f:
                f.write(self.text.get(1.0, tk.END))
            messagebox.showinfo("موفق", "فایل ذخیره شد!")

    def run(self):
        self.root.mainloop()

app = Notepad()
app.run()

جمع‌بندی و قدم بعدی

تبریک می‌گم! تو حالا می‌تونی برنامه‌های گرافیکی واقعی با پایتون بسازی! کاربرهات دیگه لازم نیست خط فرمان ببینن. درس بعدی (تحلیل داده با pandas) بهت یاد می‌ده چطور با داده‌های بزرگ کار کنی. تمرین‌ها رو توی پوشه PythonIntermediate ذخیره کن و پروژه‌هات رو توی GitHub آپلود کن تا همه ببینن چقدر پیشرفت کردی!

ارسال نظر جدید

گزارش دیدگاه