خانه / درس ۲ سطح متوسط: ساخت رابط کاربری گرافیکی (GUI) با tkinter در پایتون درس ۲ سطح متوسط: ساخت رابط کاربری گرافیکی (GUI) با tkinter در پایتون 📅 ۱۴۰۴/۰۹/۰۶ ✍️ سجاد ⌛ 4 دقیقه مطالعه 👁️ 23 پایتون | Python متوسط 🗨️ 🤍 0 📤 0% ‹ بستن لیست دروس بازکردن لیست دروس پایتون | 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 استفاده کن تمرینها: دستت رو راه بنداز! یه پنجره بساز که اسم و فامیل بگیره و سلام کنه ماشین حساب کامل با + – * / بساز برنامهای که دو عدد بگیره و جمعشون رو نشون بده لیست خرید با امکان اضافه/حذف برنامه تبدیل دما (سانتیگراد به فارنهایت) تایمر ساده با دکمه شروع/توقف برنامهای که رنگ پسزمینه رو تغییر بده فرم ثبتنام با چند فیلد برنامهای که عکس نمایش بده (با Pillow) منوی کشویی (OptionMenu) برای انتخاب شهر پنجره با اسکرولبار کلاسمحور بنویس یه 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 آپلود کن تا همه ببینن چقدر پیشرفت کردی! ← درس قبلی: درس ۱ سطح متوسط: الگوریتمها و ساختارهای داده مقدماتی در پایتون درس بعدی: درس ۴ سطح متوسط: الگوریتمهای بازگشتی (Recursion) و پیشرفته در پایتون → برچسبها: GUI پایتونpythonpython guitkinterآموزش متوسط پایتونبرنامه دسکتاپپایتونرابط کاربری ارسال نظر جدید لغو پاسخ ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم.
تبریک دوباره! تو حالا یه برنامهنویس متوسط پایتون هستی و آمادهای که برنامههات رو از خط فرمان به دنیای زیبا و رنگارنگ **رابط کاربری گرافیکی** ببری! برنامههایی مثل ماشین حساب، تقویم، یا حتی یه چتباکس ساده که کاربر با کلیک و تایپ باشون کار میکنه. تو این درس، من بهت یاد میدم چطور با کتابخانه قدرتمند و استاندارد پایتون یعنی **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 استفاده کن تمرینها: دستت رو راه بنداز! یه پنجره بساز که اسم و فامیل بگیره و سلام کنه ماشین حساب کامل با + – * / بساز برنامهای که دو عدد بگیره و جمعشون رو نشون بده لیست خرید با امکان اضافه/حذف برنامه تبدیل دما (سانتیگراد به فارنهایت) تایمر ساده با دکمه شروع/توقف برنامهای که رنگ پسزمینه رو تغییر بده فرم ثبتنام با چند فیلد برنامهای که عکس نمایش بده (با Pillow) منوی کشویی (OptionMenu) برای انتخاب شهر پنجره با اسکرولبار کلاسمحور بنویس یه 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 آپلود کن تا همه ببینن چقدر پیشرفت کردی! ← درس قبلی: درس ۱ سطح متوسط: الگوریتمها و ساختارهای داده مقدماتی در پایتون درس بعدی: درس ۴ سطح متوسط: الگوریتمهای بازگشتی (Recursion) و پیشرفته در پایتون → برچسبها: GUI پایتونpythonpython guitkinterآموزش متوسط پایتونبرنامه دسکتاپپایتونرابط کاربری