آموزش Rich در پایتون
چطور با Rich خروجی پایتون رو حرفه ای کنیم؟ فرض کن یه برنامه پایتونی نوشتی که اطلاعات چند تا سفارش رو می خونه، فایل ها رو بررسی می کنه یا وضعیت سرویس ها رو نشون می ده. برنامه درست کار می کنه، ولی توی ترمینال فقط یه عالمه خط خشک و خالی می بینی. حالا […]

چطور با Rich خروجی پایتون رو حرفه ای کنیم؟
فرض کن یه برنامه پایتونی نوشتی که اطلاعات چند تا سفارش رو می خونه، فایل ها رو بررسی می کنه یا وضعیت سرویس ها رو نشون می ده. برنامه درست کار می کنه، ولی توی ترمینال فقط یه عالمه خط خشک و خالی می بینی. حالا اگه نتیجه ها رو توی یه جدول مرتب ببینی، خطاها قرمز باشن و بفهمی چند درصد کار جلو رفته، استفاده از همون برنامه چقدر راحت تر می شه؟ این دقیقا کاریه که با کتابخانه Rich در پایتون انجام می دیم.
بچه ها، توی این آموزش کتابخانه Rich در پایتون قراره فقط چند تا متن رو رنگی نکنیم. از نصب شروع می کنیم، بعد سراغ متن رنگی، جدول، پنل، نوار پیشرفت، لاگ، خروجی JSON و نمایش خطا می ریم و در آخر یه ابزار خط فرمان کوچیک می سازیم که بتونی واقعا روی سیستم خودت اجراش کنی. کد هر قسمت رو هم گذاشتم که مجبور نباشی از روی عکس تایپ کنی.
اگه با این عبارت ها اومدی اینجا، دقیقا جای درستی هستی: «رنگی کردن خروجی پایتون»، «زیباسازی ترمینال پایتون»، «آموزش Rich پایتون»، «ساخت جدول در ترمینال پایتون» یا «نوار پیشرفت در پایتون». تفاوتشون توی عبارت جستجوئه؛ همه شون به تجربه بهتر کار کردن با برنامه های خط فرمان می رسن.

تصویری که بالا می بینی نمایی از قابلیت های Rich رو نشون می ده: رنگ، چینش، جدول و خروجی های مرتب. قرار نیست همه اینها رو توی یک شب حفظ کنی. کافیه هر بخش رو اجرا کنی و ببینی کدوم قابلیت واقعا به پروژه ات کمک می کنه.
Rich چیه و دقیقا چه کاری می کنه؟
خیلی ساده بگم: Rich یه کتابخانه رایگان و متن باز برای پایتونه که خروجی برنامه رو داخل Terminal، PowerShell، CMD یا محیط های سازگار، خواناتر و خوشگل تر نشون می ده. یعنی می تونی به جای متن ساده از رنگ، استایل، جدول، کادر، نمودار متنی، خروجی Markdown، نمایش کد و گزارش خطای مرتب استفاده کنی. مستندات اصلیش هم توی GitHub پروژه Rich و راهنمای رسمی Rich قرار داره.
یه سوءتفاهم رو همین اول برطرف کنم: Rich به معنی ساخت پنجره گرافیکی با دکمه و فرم مثل برنامه های دسکتاپ نیست. چیزی که می سازیم CLI یا ابزار خط فرمانه. اگه رابط گرافیکی کامل می خوای، باید سراغ ابزارهای دیگه بری. مثلا Textual برای ساخت رابط متنی تعاملی، Tkinter یا PySide برای برنامه دسکتاپ، و Flutter برای ساخت اپ چند پلتفرمی کاربرد دارن. انتخاب درست از خود ابزار مهم تره.
راستی Rich فقط برای ظاهر نیست. وقتی یه ابزار واقعی داری که باید چند تا فایل، IP، رکورد یا نتیجه پردازش رو گزارش بده، زیباسازی خروجی پایتون می تونه تفاوت بین «یه مشت متن نامفهوم» و «گزارشی که بشه سریع تصمیم گرفت» باشه. البته رنگ قرمز به تنهایی خطا رو رفع نمی کنه؛ فقط کمک می کنه سریع تر ببینیش.
Rich با چه نسخه ای از پایتون کار می کنه؟
طبق انتشار رسمی Rich 15.0.0 در آوریل ۲۰۲۶، این نسخه حداقل Python 3.9 می خواد. روی ویندوز، لینوکس و مک قابل استفاده است. توی Windows Terminal معمولا رنگ و ایموجی بهتر از CMD خیلی قدیمی نمایش داده می شه. در ترمینال های مختلف، مخصوصا متن فارسی راست به چپ، چیدمان و پشتیبانی فونت ممکنه فرق کنه؛ این محدودیت خود محیط نمایش هم هست، نه لزوما ایراد Rich.
| سؤال سریع | پاسخ کوتاه |
|---|---|
| آیا Rich رایگانه؟ | بله؛ پروژه متن باز با مجوز MIT است. |
| آیا روی ویندوز کار می کنه؟ | بله؛ Windows Terminal انتخاب مناسبی برای دیدن رنگ هاست. |
| آیا روی لینوکس و مک کار می کنه؟ | بله؛ از ترمینال های سازگار استفاده کن. |
| برای ساخت سایت خوبه؟ | برای گزارش های CLI خوبه؛ جای HTML یا رابط وب رو نمی گیره. |
| آیا برای اجرای کدها به اینترنت نیاز دارم؟ | برای نصب اولیه و دریافت وابستگی ها معمولا بله؛ بعد از نصب، بیشتر مثال های این مقاله آفلاین اجرا می شن. |
نصب کتابخانه Rich در ویندوز، لینوکس و مک
حالا بریم سر اصل کار. قبل از نصب کتابخانه Rich در پایتون، اول مطمئن شو پایتونت شناسایی می شه. توی ویندوز می تونی PowerShell یا CMD باز کنی؛ روی لینوکس و مک هم Terminal رو اجرا کن. هر جا چند نسخه پایتون روی سیستم داری، بهتره بسته رو با همون مفسری نصب کنی که پروژه ات رو اجرا می کنه.
python --version
python -m pip --versionاگه روی لینوکس یا مک دستور python وجود نداشت ولی python3 کار کرد، از python3 استفاده کن. اگر خروجی Python 3.8 دیدی، برای نسخه ۱۵ Rich باید پایتون رو به 3.9 یا بالاتر ارتقا بدی؛ نصب نسخه جدید روی نسخه قدیمی پایتون راه حل درستی نیست.
من پیشنهاد می کنم برای هر پروژه یه محیط مجازی بسازی تا نصب بسته ها با نرم افزارهای دیگه قاطی نشه. این کار مخصوصا روی لینوکس های جدید که ممکنه با خطای externally-managed-environment روبرو بشی، خیلی به درد می خوره.
روش نصب در ویندوز
py -m venv .venv
.venv\Scripts\python.exe -m pip install --upgrade pip
.venv\Scripts\python.exe -m pip install rich
.venv\Scripts\python.exe -m richاین دستورها بدون نیاز به فعال کردن محیط مجازی هم کار می کنن. هر دستور داخل پوشه پروژه اجرا بشه. اگه دستور py روی ویندوزت شناسایی نشد، همون python رو جایگزین کن. دستور آخر یه دموی واقعی از امکانات Rich نمایش می ده؛ پس اولین تست رنگی کردن ترمینال پایتون رو همین جا می بینی.
روش نصب در لینوکس و مک
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install rich
.venv/bin/python -m richروی بعضی توزیع های Debian یا Ubuntu ممکنه بسته python3-venv نصب نباشه. اگر ساخت محیط مجازی خطا داد، اول بسته مربوط به نسخه پایتون خودت رو از مخازن رسمی توزیع نصب کن. برای نصب Rich، سراغ sudo pip install یا گزینه --break-system-packages نرو؛ با محیط مجازی معمولا نیازی به دستکاری پایتون سیستمی نداری.
مشکل دانلود پکیج از ایران چیه؟
اگه داخل ایران هستی و نصب با pip روی دانلود متوقف شد، اول بررسی کن اینترنت و DNS کار می کنه یا نه. گاهی اختلال مسیر، محدودیت دسترسی به سرویس خارجی، تنظیم پراکسی یا مشکل گواهی TLS باعث خطاست. ممکنه مرورگرت با تحریم شکن به اینترنت وصل باشه، ولی ترمینال از اون مسیر استفاده نکنه. بهتره قبل از تغییر آدرس مخزن یا خاموش کردن بررسی گواهی، اتصال خود ترمینال رو درست کنی.
یه نکته امنیتی هم این وسط مهمه: برای رفع خطا، گواهی HTTPS رو خاموش نکن و بسته Rich رو از فایل ناشناس دانلود نکن. مرجع اصلی بسته PyPI و مخزن رسمی GitHub هست. اگه فقط لازم داری خروجی روی صفحه قشنگ باشه، دلیلی نداره برای یک تغییر ظاهری امنیت نصب رو پایین بیاری.
اگه تا الان برای رنگی کردن خروجی پایتون از کدهای ANSI استفاده می کردی، اینجا قرار نیست همه چیز رو از اول اختراع کنی. آموزش Rich پایتون کمک می کنه قواعد نمایش رو از منطق اصلی کدت جدا نگه داری؛ یعنی اگه رنگ ها عوض شدن، نیازی نیست حلقه پردازش اطلاعات رو دستکاری کنی.
رنگی کردن متن در پایتون با Rich
برای شروع رنگی کردن خروجی پایتون، راحت ترین روش اینه که print خود Rich رو وارد کنی. داخل متن، تگ هایی مثل [bold green] می نویسی و Rich موقع نمایش اونها رو به رنگ و استایل تبدیل می کنه. خود متن اصلی برنامه هم همچنان یه رشته پایتونیه.
from rich import print
print("[bold green]SUCCESS[/bold green] Backup completed")
print("[yellow]WARNING[/yellow] Storage is almost full")
print("[bold red]ERROR[/bold red] Connection failed")خب، این اولین کاربرد واقعیه. برای ابزار بکاپ، خروجی سبز یعنی کار تموم شده؛ زرد یعنی باید یه چیزی رو بررسی کنیم؛ قرمز یعنی مشکلی پیش اومده. کتابخانه Rich در پایتون رنگ ها رو برای چشم خوشگل نمی کنه که فقط عکس بگیری؛ وقتی معنی رنگ ها مشخص باشه، خواندن گزارش سریع تر می شه.
البته حواست باشه که از from rich import print استفاده کنی، نه print داخلی پایتون. روش دوم استفاده از Console هست که امکانات خیلی بیشتری مثل لاگ، جدول و ذخیره خروجی در اختیارت می ذاره. برای پروژه واقعی، من معمولا از Console استفاده می کنم.
from rich.console import Console
console = Console()
console.print("Server is [bold green]online[/bold green]")
console.print("Disk warning", style="bold yellow")
console.rule("SYSTEM REPORT")اینجا console.print() برای چاپ خروجی، و console.rule() برای کشیدن یک خط جداکننده با عنوان استفاده می شه. برای زیباسازی ترمینال پایتون همین چند خط گاهی کافیه تا اسکریپتت از حالت آزمایشی دربیاد و قابل استفاده بشه.
چرا نباید همیشه متن دریافتی کاربر رو با Markup چاپ کنیم؟
فرض کن نام یک فایل یا پیام رو از کاربر دریافت کردی و داخلش علامت هایی شبیه [red] بود. اگر Rich اون متن رو به عنوان Markup تفسیر کنه، ممکنه ظاهر نتیجه عوض بشه یا خروجی چیزی نباشه که انتظار داری. برای داده ای که از بیرون میاد، تفسیر Markup رو خاموش کن. این نکته کوچک توی ابزارهای واقعی خیلی اهمیت داره.
from rich.console import Console
console = Console()
filename = "[red]backup.zip"
console.print(filename, markup=False)تفاوت print، log، out و pretty توی Rich
بریم سراغ یکی از سؤال هایی که بعد از آموزش کتابخانه Rich در پایتون زیاد پیش میاد: این همه روش برای خروجی گرفتن چه فرقی دارن؟ در نگاه اول همه شون یه چیزی روی صفحه چاپ می کنن، ولی هر کدوم برای موقعیت متفاوتی خوبه.
| ابزار | به چه دردی می خوره؟ | فرق مهم |
|---|---|---|
print() | پیام ها و خروجی معمولی | استایل و قالب بندی Rich رو پشتیبانی می کنه. |
console.log() | بررسی اجرای کد و دیباگ | زمان و محل اجرای کد رو هم نشون می ده. |
console.out() | چاپ خروجی ساده و سطح پایین تر | برای خروجی متنی بدون قالب بندی Rich مناسبه. |
pretty.install() | خواناتر کردن ساختار داده در REPL | روی نمایش تعاملی داده ها اثر می ذاره، نه اینکه همه چاپ ها رو تبدیل کنه. |
console.rule() | جدا کردن بخش های گزارش | یه خط با عنوان یا بدون عنوان می سازه. |
console.pager() | نمایش خروجی طولانی | کار با صفحه بندی به ترمینال و پیکربندی وابسته است. |
from rich.console import Console
from rich import pretty
console = Console()
pretty.install()
items = {"status": "ok", "count": 3, "files": ["a.py", "b.py"]}
console.print(items)
console.log("Loaded data", items)
console.out("Plain text output")
console.rule("NEXT STEP")اگه ازت بپرسم برای اسکریپتی که روی سرور اجرا می شه کدوم بهتره، جوابم فقط «قشنگ ترین» نیست. مثلا console.log() برای فهمیدن مراحل اجرای برنامه خوبه، ولی به جای سیستم لاگ حرفه ای با فایل، سطح دسترسی و نگهداری مشخص قرار نمی گیره. می تونی Rich رو به ماژول استاندارد logging هم وصل کنی که جلوتر نمونه اش رو می بینیم.
ویدیوی کوتاه بالا رو ببین؛ کمک می کنه تفاوت خروجی عادی و نمایش مرتب در کنسول رو سریع تر متوجه بشی. اگه محیط ترمینال تو از نظر رنگ یا فونت کمی با تصویر فرق داشت، عجیب نیست؛ بعضی قابلیت های نمایش به فونت و Terminal بستگی دارن.
ساخت جدول رنگی در ترمینال پایتون
حالا فرض کن یه اسکریپت نوشتی که وضعیت چند سرویس رو بررسی می کنه. چاپ کردن نتیجه ها با print مشکلی نداره، ولی وقتی تعداد سطرها زیاد بشه چشم خسته می شه. با کلاس Table می تونی خروجی رو مثل یه جدول مرتب ببینی. این یکی از کاربردی ترین بخش های آموزش Rich پایتون برای من بوده.
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(title="Service Health")
table.add_column("Service", style="cyan")
table.add_column("Status", justify="center")
table.add_column("Latency", justify="right")
table.add_row("API", "[green]OK[/green]", "42 ms")
table.add_row("Database", "[green]OK[/green]", "18 ms")
table.add_row("Backup", "[yellow]WARN[/yellow]", "210 ms")
console.print(table)این جدول برای وضعیت فرضی سه سرویسه؛ یعنی کد بالا هیچ سرور واقعی رو اسکن نمی کنه. اما می تونی بعدا نتیجه درخواست HTTP، وضعیت بکاپ یا پردازش فایل خودت رو داخلش بذاری. تفاوت اصلی ساخت جدول در ترمینال پایتون با چاپ دستی ستون ها اینه که Rich تا جای ممکن فاصله و عرض ستون ها رو خودش مدیریت می کنه.
برای زیباسازی خروجی پایتون لازم نیست همه خط ها رنگی باشن. چند رنگ با معنای ثابت، فاصله درست و یک خط جداکننده گاهی از ده تا رنگ متنوع حرفه ای تره. به نظرم وقتی خروجی پروژه رو به همکارت می دی، خوانا بودن مهم تر از شلوغی ظاهره.
پنل و کادر برای پیام های مهم
برای پیام هایی که باید بیشتر دیده بشن، کلاس Panel خیلی کار راه اندازه. مثلا توی ابزار نصب، یک پیام راهنما یا یک هشدار قبل از تغییر تنظیمات، بهتره داخل کادر جدا نمایش داده بشه. این هم یکی از روش های ساده زیباسازی خروجی پایتون بدون طراحی رابط گرافیکیه.
from rich.console import Console
from rich.panel import Panel
console = Console()
console.print(Panel("Check the target folder before continuing.", title="NOTICE", border_style="yellow"))یه نکته هم درباره ساخت جدول در ترمینال پایتون: وقتی اطلاعات خیلی زیاد شد، بهتره همه ردیف ها رو یکجا چاپ نکنی. مثلا آخرین ۲۰ نتیجه یا فقط خطاها رو در جدول بذار و خروجی کامل رو جدا ذخیره کن. این روش توی ابزارهای واقعی کمک می کنه گزارش سریع خوانده بشه.
نوار پیشرفت در پایتون با Rich
یه برنامه رو تصور کن که باید ۵۰۰ فایل رو بررسی کنه. اگه فقط یه پیام «لطفا صبر کنید» نشون بده، آدم نمی فهمه برنامه گیر کرده یا واقعا داره کار می کنه. نوار پیشرفت در پایتون دقیقا برای همین ساخته شده. در Rich می تونی از track() برای حلقه های ساده استفاده کنی یا با Progress چند کار رو همزمان نمایش بدی.
from time import sleep
from rich.progress import track
for item in track(range(20), description="Processing..."):
sleep(0.03)اینجا عدد ۲۰ یعنی ۲۰ مرحله تمرینی داریم و sleep فقط برای اینه که حرکت نوار رو ببینی. توی پروژه واقعی باید داخل حلقه عملیات واقعی رو انجام بدی. اگه پردازش واقعا تمام نشده، نشون دادن عدد ۱۰۰٪ گمراه کننده است. همین فرق یه دمو با برنامه قابل اعتماده.
from time import sleep
from rich.progress import Progress
with Progress() as progress:
files = progress.add_task("Files", total=30)
records = progress.add_task("Records", total=60)
for _ in range(30):
sleep(0.02)
progress.update(files, advance=1)
progress.update(records, advance=2)اگه دنبال «نمایش درصد پیشرفت در پایتون» یا «Progress Bar پایتون» بودی، این قسمت همون جواب عملیه. کتابخانه Rich در پایتون برای یه برنامه CLI می تونه همزمان چند نوار پیشرفت نشون بده؛ ولی بهتره اطلاعات واقعی مثل تعداد فایل پردازش شده رو بهش بدی، نه درصد ساختگی.
وقتی درصد پیشرفت مشخص نیست چی؟
بعضی کارها مثل منتظر موندن برای اتصال به API درصد مشخص ندارن. اینجا استفاده از Spinner یا Status منطقی تره. با این روش به کاربر می گی برنامه زنده است و الان چه کاری انجام می ده، بدون اینکه زمان پایان رو حدس بزنی.
from time import sleep
from rich.console import Console
console = Console()
with console.status("Connecting to service...", spinner="dots"):
sleep(1)
console.print("[green]Ready[/green]")برای تمرین نوار پیشرفت در پایتون یه چالش کوچیک دارم: برنامه ای بنویس که ۳۰ فایل آزمایشی رو دونه دونه بخونه و برای هر فایل بعد از پایان کار فقط یک واحد پیشرفت بده. اگه کار نصفه موند، Progress هم باید همون مقدار واقعی رو نشون بده. این تمرین فرق نمایش جذاب و گزارش قابل اعتماد رو خوب جا می اندازه.
نمایش JSON، ساختار پوشه و کد پایتون
یکی دیگه از کارهایی که با Rich خیلی تمیز درمیاد، نمایش داده های شلوغه. وقتی از API خروجی JSON می گیری یا می خوای ساختار پوشه ها رو گزارش بدی، با زیباسازی ترمینال پایتون می تونی اطلاعات رو بدون ساختن صفحه وب بخونی. مخصوصا برای بچه هایی که بک اند، لینوکس یا ابزار اتوماسیون می نویسن، این موضوع واقعا به درد می خوره.
from rich.console import Console
console = Console()
console.print_json(data={"project": "Nabegheha", "status": "ok", "tasks": [1, 2, 3]})from rich.console import Console
from rich.tree import Tree
console = Console()
tree = Tree("my_project")
tree.add("app.py")
config = tree.add("config")
config.add("settings.json")
tree.add("requirements.txt")
console.print(tree)from rich.console import Console
from rich.syntax import Syntax
console = Console()
sample = "def add(a, b):\n return a + b"
console.print(Syntax(sample, "python", line_numbers=True))توجه کن که Rich قرار نیست جای فرمت استاندارد JSON یا ابزار نمایش کد در IDE رو بگیره. اینجا خروجی رو برای انسان خواناتر می کنه. اگر داده رو قراره برنامه دیگه ای دریافت کنه، بهتره همون JSON یا متن ماشینی تمیز تحویل بدی و رنگ ها رو قاطی داده نهایی نکنی.
نمایش خطا و دیباگ حرفه ای با Rich
اگه موقع اجرای اسکریپت یه خطا اتفاق بیفته، Traceback پیش فرض پایتون می تونه طولانی باشه. با rich.traceback.install() خروجی رو خواناتر می کنی و بخش های مهم خطا مشخص تر می شن. برای کسی که تازه پایتون یاد می گیره، این یکی از جذاب ترین قسمت های آموزش کتابخانه Rich در پایتون است.
from rich.traceback import install
install(show_locals=False)
numbers = [1, 2, 3]
print(numbers[10])این مثال عمدا خطا تولید می کنه تا شکل Traceback رو ببینی؛ پس شکست اجرای این فایل انتظار ماست. show_locals=False رو هم بی دلیل عوض نکن. نمایش متغیرهای محلی ممکنه رمز عبور، توکن یا اطلاعات حساس برنامه رو داخل خروجی خطا یا اسکرین شات لو بده.
اگه روی سرور یا داخل پروژه امنیتی کار می کنی، به همین یک نکته دقت کن: خروجی جذاب هیچ وقت نباید باعث بشه اسرار پروژه رو منتشر کنی. برای شروع امن تر، اطلاعات خصوصی رو در لاگ ننویس و خروجی رنگی رو بیشتر برای کنسول توسعه نگه دار.
اتصال Rich به logging پایتون
برای پروژه های کمی جدی تر، بهتره به جای چاپ کردن همه پیام ها با print، از ماژول استاندارد logging استفاده کنی. Rich یه Handler داره که گزارش ها رو توی ترمینال مرتب نشون می ده و در عین حال ساختار اصلی لاگ پایتون رو نگه می داره.
import logging
from rich.logging import RichHandler
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
handlers=[RichHandler(rich_tracebacks=True)],
)
logger = logging.getLogger("demo")
logger.info("Application started")
logger.warning("Configuration file not found")اگه دنبال آموزش Rich پایتون برای پروژه واقعی هستی، بخش بعدی رو با دقت اجرا کن. این بار قرار نیست صرفا یه پیام رنگی ببینی؛ چند بخش کتابخانه Rich در پایتون رو کنار هم می ذاریم و نتیجه رو روی فایل های واقعی پوشه خودمون می بینیم.
پروژه عملی: داشبورد وضعیت فایل ها در ترمینال
حالا بریم سراغ چیزی که من بیشتر دوست دارم: استفاده از آموخته ها توی یه پروژه واقعی و کوچک. می خوایم یک ابزار بسازیم که پوشه ای رو که بهش می دی بررسی کنه، تعداد محدودی فایل رو بخونه، نوار پیشرفت نشون بده و در آخر یه جدول از نام و حجم فایل ها تحویل بده. این پروژه برای یادگیری آموزش Rich پایتون عالیه چون چند قابلیت رو کنار هم می بینی.
برای اینکه مثال قابل اجرا و امن باشه، برنامه فقط فایل ها رو فهرست می کنه و هیچ چیزی رو حذف، ویرایش یا آپلود نمی کنه. اگه دوست داری اول روی یه پوشه آزمایشی اجراش کن. مسیر پوشه رو به صورت آرگومان می دی، و اگر ندادی، روی پوشه فعلی کار می کنه. در نسخه اول فقط فایل های سطح اول پوشه رو می خونه، نه پوشه های تو در تو.
import sys
from pathlib import Path
from rich.console import Console
from rich.panel import Panel
from rich.progress import track
from rich.text import Text
from rich.table import Table
console = Console()
folder = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.cwd()
if not folder.is_dir():
console.print("[bold red]Invalid folder[/bold red]")
raise SystemExit(1)
files = sorted((item for item in folder.iterdir() if item.is_file()), key=lambda x: x.name)[:50]
console.print(Panel(Text(f"Scanning: {folder}"), title="File Report", border_style="cyan"))
rows = []
for item in track(files, description="Reading files..."):
try:
size = item.stat().st_size
rows.append((item.name, size))
except OSError:
rows.append((item.name, None))
table = Table(title="Local Files")
table.add_column("Name", overflow="fold")
table.add_column("Size (bytes)", justify="right")
for name, size in rows:
value = str(size) if size is not None else "N/A"
table.add_row(name, value)
console.print(table)
console.print(f"[green]Done[/green] - {len(rows)} files listed")این کد رو داخل فایلی به اسم file_report.py ذخیره کن. توی ویندوز بعد از نصب Rich، از محیط مجازی خودت اجراش کن. توی لینوکس و مک هم شکل اجرا همینه، فقط دستور پایتون ممکنه python3 باشه.
python file_report.py .یه نکته ریز ولی مهم: track() وقتی روی لیستی از فایل ها می چرخه، پیشرفت تعداد آیتم ها رو نشون می ده. اگه پوشه خیلی شلوغ باشه، برنامه فعلا فقط ۵۰ فایل اول رو جدول می کنه که خروجی قابل خوندن بمونه. اگه خواستی تمرینش رو کامل تر کنی، مرتب سازی بر اساس حجم، فیلتر پسوند و خروجی CSV رو خودت اضافه کن.
حالا فرض کن همین ابزار برای بررسی گزارش های یک پروژه شرکت استفاده بشه. با رنگی کردن خروجی پایتون، کاربر سریع می فهمه کار تموم شده یا خطا داشته. اما کیفیت واقعی کار، توی منطق درست بررسی فایل ها و مدیریت خطاست؛ اینجا Rich فقط کمک می کنه نتیجه اون منطق رو بهتر ببینیم.
همین پروژه تمرین خوبیه برای اینکه ببینی زیباسازی ترمینال پایتون باید چه مشکلی رو حل کنه: وقتی ۵۰ اسم فایل داری، بدون جدول پیدا کردن بزرگ ترین مورد سخته؛ وقتی کار طول می کشه، بدون Progress متوجه نمی شی چقدر مونده. از این زاویه، ظاهر بهتر یه ابزار کمکی برای درک اطلاعاته.
Rich بهتره یا colorama، tqdm و Textual؟
طبیعیه که وسط آموزش کتابخانه Rich در پایتون این سؤال برات پیش بیاد: چرا از یه کتابخانه سبک تر استفاده نکنیم؟ جواب بستگی به نیازت داره. هیچ کتابخانه ای برای همه پروژه ها بهترین نیست. اگه فقط یه رنگ ساده می خوای، یه ابزار کوچیک ممکنه کافی باشه؛ اگه گزارش کامل و جدول می خوای، Rich گزینه جذاب تری می شه.
| ابزار | کار اصلی | چه زمانی انتخابش کنیم؟ |
|---|---|---|
Rich | خروجی رنگی، جدول، پنل، لاگ و Progress | وقتی یه CLI مرتب و چند قابلیتی می خوای. |
colorama | کمک به کار با رنگ های ANSI مخصوصا در ویندوز | وقتی فقط به رنگ یا سازگاری ANSI نیاز داری. |
tqdm | نوار پیشرفت ساده و قابل اتکا | وقتی تمرکز اصلی فقط پیشرفت حلقه هاست. |
Textual | ساخت رابط متنی تعاملی با صفحه بندی و کنترل | وقتی ابزار ترمینالی تعاملی می خوای. |
Flutter | ساخت اپ با رابط گرافیکی برای چند پلتفرم | وقتی خروجی واقعا اپ گرافیکی موبایل یا دسکتاپ می خوای. |
پس اگه دنبال «ساخت رابط گرافیکی در پایتون» هستی، فقط سراغ Rich نرو. این کتابخانه برای محیط خط فرمانه. ولی اگه روی ابزارهای توسعه، اسکریپت های مدیریت سیستم، گزارش گیری یا تست های مجاز امنیتی کار می کنی، به احتمال زیاد Rich خیلی سریع ارزشش رو نشون می ده.
هر ابزار رو برای هدف خودش انتخاب کن. برای رنگی کردن خروجی پایتون و ساخت یک گزارش کامل، Rich کار رو ساده می کنه. برای بازی گرافیکی سنگین یا اپ موبایل ابزار دیگری می خوای؛ به همین دلیل من توصیه نمی کنم فقط چون یه کتابخانه محبوبه، همه پروژه ها رو با اون بسازی.
رفع خطاهای رایج نصب و اجرای Rich
ممکنه با اینکه دستور نصب رو زدی، توی کدت خطا بگیری. اینجا به جای حدس زدن، از خود پیام خطا استفاده کن. مخصوصا اگر چند تا پایتون روی سیستم نصب داری، قبل از هر کاری مسیر مفسر رو چک کن. خیلی از مشکلات ظاهرا مربوط به کتابخانه Rich در پایتون، در واقع به محیط مجازی یا ترمینال برمی گردن.
خطای No module named rich
این پیام معمولا یعنی با یه پایتون Rich رو نصب کردی و با یه پایتون دیگه داری فایل رو اجرا می کنی. دستور نصب رو با همون مسیری اجرا کن که پروژه ازش استفاده می کنه. در VS Code هم گزینه Python Interpreter رو بررسی کن. استفاده کورکورانه از چند دستور pip مختلف معمولا مشکل رو بدتر می کنه.
python -c "import sys; print(sys.executable)"
python -m pip show richمتن رنگی نمایش داده نمی شه یا همه چیز سیاه و سفیده
اول توی Windows Terminal یا ترمینال واقعی سیستم اجرا کن، نه هر خروجی داخلی IDE. بعضی محیط ها قابلیت ANSI یا رنگ کامل رو محدود می کنن. اگه خروجی رو به فایل یا Pipe فرستادی، Rich ممکنه عمدا رنگ رو حذف کنه تا فایل متنی تمیز بمونه. این رفتار طبیعی و مفیده.
چرا حروف فارسی یا ایموجی توی جدول جابجا می شن؟
نمایش راست به چپ و عرض کاراکترها تا حد زیادی به فونت و موتور رندر ترمینال مربوطه. Windows Terminal، یک ترمینال مدرن لینوکس یا iTerm روی مک ممکنه نتیجه های متفاوتی بدن. برای جدول هایی که خیلی مهمن، می تونی نام ستون ها رو انگلیسی بذاری و قبل از تحویل خروجی فارسی روی محیط واقعی مخاطبت تست کنی.
خطای externally-managed-environment در لینوکس
این پیام بیشتر یعنی توزیع لینوکس اجازه نمی ده با pip سیستم خودش رو مستقیم تغییر بدی. روش درست، ساخت venv و نصب کتابخانه داخل همون محیط مجازیه. نیازی به خاموش کردن محافظت مدیریت بسته ها نیست. اگه تازه لینوکس رو شروع کردی، فهمیدن این موضوع خودش یه قدم مهم توی یادگیری مدیریت محیط پایتونه.
نوار پیشرفت حرکت نمی کنه
اول مطمئن شو حلقه واقعا جلو می ره و کاری که شمردی همون چیزیه که اجرا می کنی. توی محیط های غیر تعاملی یا Notebook ممکنه Refresh مثل ترمینال معمولی نباشه. برای تست اولیه از python -m rich و نمونه track() همین مقاله استفاده کن.
وقتی متن داخل براکت نمایش داده نمی شه
اگه رشته ای شامل براکت های شبیه تگ Rich باشه، ممکنه به عنوان Markup تفسیر بشه. برای داده کاربر از markup=False یا متن مناسب استفاده کن. این قسمت توی ابزارهایی که نام فایل، محتوای خطا یا ورودی ناشناس دارن خیلی مهمه.
در مسیر عیب یابی هم همین نگاه رو داشته باش: آموزش کتابخانه Rich در پایتون از نصب درست محیط شروع می شه. وقتی چند مفسر روی سیستم داری، قبل از پاک و نصب کردن همه چیز، مسیر مفسر و بسته رو بررسی کن. خیلی وقت ها به جای تغییر کلی سیستم، فقط باید Interpreter پروژه رو درست انتخاب کنی.
Rich توی پروژه پایتون، لینوکس و امنیت چه کاربردی داره؟
بچه ها، یکی از چیزهایی که توی آموزش برنامه نویسی دوست دارم روشنش کنم اینه که خروجی خوشگل به تنهایی مهارت نیست. فرض کن داری یه ابزار مانیتورینگ روی لینوکس می نویسی، می خوای وضعیت سرویس ها، فضای دیسک یا نتیجه یک بررسی امنیتی مجاز رو نشون بدی. داشتن یه جدول مرتب و پیام های واضح به درد کاربر می خوره، ولی پشت همون جدول باید بلد باشی داده درست جمع کنی و خطاها رو مدیریت کنی.
اگه می خوای این مسیر رو جدی ادامه بدی، از پایتون برای منطق برنامه، از آموزش لینوکس اسنشیالز برای شناخت سیستم عامل و ترمینال و از آموزش رایگان تست نفوذ برای آشنایی با گزارش گیری و بررسی امنیتی مجاز شروع کن. وقتی اینها رو بفهمی، استفاده از کتابخانه Rich در پایتون برای ساخت گزارش های بهتر خیلی منطقی تر می شه. اگه هنوز پایه پایتونت ضعیفه، اول دوره کامل پایتون نابغه ها رو از نظر سرفصل ها بررسی کن و ببین به کدوم مباحث نیاز داری.
از اون طرف اگه هدف اصلیت ساخت اپ با دکمه، فرم، انیمیشن و رابط بصریه، بد نیست مسیر یادگیری فلاتر رو هم ببینی. Rich و Flutter رقیب مستقیم نیستن؛ یکیش برای خروجی ترمینال و اون یکی برای اپ گرافیکی استفاده می شه. شاید هم از ساخت ابزار کوچک با پایتون خوشت بیاد و بعد بخوای مثل پروژه ساخت بازی فلاپی برد با پایتون سراغ پروژه های جذاب تر بری. مهم اینه که بدونی داری برای چه کسی و چه کاری کد می نویسی.
برای شروع یادگیری، هر هفته یه ابزار کوچک بساز و خروجیش رو بهتر کن. مثلا این هفته یه گزارش فایل، هفته بعد مانیتور وضعیت یک API که خودت داری، و هفته بعد خروجی JSON و لاگ. کم کم می بینی چقدر از چیزهایی که یاد گرفتی کنار هم می شینن. اگه هنوز نمی دونی از کجا شروع کنی، نقشه راه شروع برنامه نویسی هم کمکت می کنه بین مسیرهای مختلف سردرگم نشی.
قبل از سوال ها، یه جمع بندی کوچک از چند مسیر جستجو هم داشته باشیم: آموزش Rich پایتون برای کسی که خروجی حرفه ای می خواد شروع خوبیه؛ رنگی کردن خروجی پایتون برای خوانایی پیام ها کمک می کنه؛ و نوار پیشرفت در پایتون وقتی معنی داره که کار واقعی رو اندازه بگیری. هیچ کدوم به تنهایی جای منطق درست برنامه رو نمی گیرن.
سوالات متداول کتابخانه Rich در پایتون
کتابخانه Rich در پایتون چیست؟
یه کتابخانه متن باز برای نمایش متن رنگی، جدول، نوار پیشرفت، کد، Markdown و خروجی های مرتب داخل ترمیناله. برای ساخت رابط گرافیکی پنجره ای نیست.
برای رنگی کردن خروجی پایتون چه کتابخانه ای بهتره؟
اگه فقط رنگ ساده می خوای colorama هم می تونه کافی باشه. اگه جدول، پنل، لاگ و Progress رو کنار هم می خوای، Rich انتخاب مناسبیه.
آموزش کتابخانه Rich در پایتون برای مبتدی ها هم مناسبه؟
بله. اگه متغیر، تابع، حلقه و import رو در حد پایه بلد باشی، می تونی بیشتر مثال های این صفحه رو اجرا کنی. برای پروژه پایانی کمی آشنایی با فایل و Path هم مفیده.
چطور کتابخانه Rich را نصب کنیم؟
بهتره داخل محیط مجازی با دستور python -m pip install rich نصبش کنی. بعد با python -m rich دموی رسمی رو اجرا کن.
Rich در ویندوز 11 کار می کنه؟
بله. بهتره خروجی رو توی Windows Terminal ببینی. بعضی محدودیت های رنگ و فونت به محیط ترمینال مربوط می شن.
Rich روی لینوکس و مک هم نصب می شه؟
بله. فقط نسخه پایتون و محیط مجازی رو درست انتخاب کن. خود کتابخانه محدود به ویندوز نیست.
چرا pip install rich خطا می ده؟
ممکنه اینترنت یا دسترسی به PyPI، نسخه پایتون، محیط مجازی یا گواهی TLS مشکل داشته باشه. به جای خاموش کردن امنیت HTTPS، متن خطا و مسیر پایتون رو بررسی کن.
در سال 2026 Rich به چه نسخه ای از Python نیاز داره؟
در نسخه 15.0.0 کتابخانه Rich که آوریل ۲۰۲۶ منتشر شد حداقل Python 3.9 لازمه. نسخه های قدیمی تر ممکنه نیازهای متفاوتی داشته باشن.
آیا کتابخانه Rich برای ساخت GUI مناسبه؟
نه. Rich برای خروجی های ترمینالی طراحی شده. برای پنجره دسکتاپ یا اپ موبایل باید ابزار متناسب با رابط گرافیکی انتخاب کنی.
چطور جدول در ترمینال پایتون بسازیم؟
از rich.table.Table استفاده کن، ستون ها رو با add_column و ردیف ها رو با add_row اضافه کن و جدول رو با console.print نمایش بده.
چطور نوار پیشرفت در پایتون بسازیم؟
برای حلقه ساده track() و برای چند وظیفه همزمان Progress مناسبه. حواست باشه درصد پیشرفت از کار واقعی بیاد.
فرق Rich و tqdm چیه؟
اگه فقط یه نوار پیشرفت لازم داری، tqdm ابزار مناسبیه. ولی Rich علاوه بر Progress امکانات متنوعی برای قالب بندی خروجی ترمینال داره.
فرق Rich و Textual چیه؟
برای چاپ خروجی زیبا در ترمینال از Rich استفاده می کنیم. Textual برای ساخت برنامه تعاملی متنی با اجزای رابط کاربری طراحی شده.
فرق Rich و Flutter چیه؟
برای خروجی CLI پایتون، Rich مناسبه؛ اما Flutter فریم ورک ساخت رابط گرافیکی اپ برای چند پلتفرمه. انتخابشون به محصول مورد نظر بستگی داره.
چرا رنگ های Rich توی CMD دیده نمی شن؟
ممکنه ترمینال یا تنظیمات محیط رنگ رو محدود کرده باشن. تست رو در Windows Terminal انجام بده و متغیرهای TERM یا NO_COLOR رو هم بررسی کن.
چرا متن فارسی توی جدول Rich به هم می ریزه؟
ترمینال ها در نمایش متن راست به چپ و عرض بعضی کاراکترها تفاوت دارن. فونت و ترمینال رو تغییر بده و جدول رو روی دستگاه واقعی بررسی کن.
آیا می شه خروجی Rich را به فایل ذخیره کرد؟
بله، Rich امکانات خروجی گرفتن داره؛ ولی خروجی متن ساده، HTML یا SVG با یکدیگر فرق دارن. برای فایل قابل پردازش توسط برنامه دیگه، داده ساخت یافته رو جدا ذخیره کن.
چطور JSON را با Rich رنگی کنیم؟
با console.print_json(data=...) می تونی داده JSON رو به صورت مرتب نمایش بدی. برای ذخیره داده اصلی از ماژول استاندارد json استفاده کن.
چطور با Rich خطاهای پایتون را خواناتر کنیم؟
از rich.traceback.install() استفاده کن. روی سیستم واقعی مراقب باش متغیرهای خصوصی در خروجی خطا منتشر نشن.
آیا Rich به اینترنت دائمی نیاز داره؟
برای دانلود بسته و وابستگی ها معمولا اینترنت لازمه. بعد از نصب، مثال های محلی مقاله به اتصال دائمی احتیاج ندارن.
آیا می تونم از Rich برای ابزارهای لینوکسی استفاده کنم؟
بله. گزارش وضعیت سرویس، فایل، بکاپ یا خروجی پردازش از کاربردهای مناسب Rich در اسکریپت های مدیریت سیستم هست.
آیا با Rich می شه برنامه هک ساخت؟
خود Rich ابزار هک یا اسکن نیست. فقط می تونه نتایج ابزارهای قانونی و مجاز امنیتی رو مرتب و خوانا نشون بده.
چرا print داخلی پایتون رنگی نیست؟
تابع داخلی print فقط متن رو چاپ می کنه. با وارد کردن print از Rich یا استفاده از Console می تونی استایل و Markup داشته باشی.
آیا Rich روی Python 3.8 نصب می شه؟
نسخه ۱۵ Rich نه؛ چون پشتیبانی از Python 3.8 در این نسخه حذف شده. بهتره به Python 3.9 یا جدیدتر ارتقا بدی.
برای پروژه واقعی از log استفاده کنم یا print؟
برای خروجی کاربردی به کاربر، console.print خوبه؛ برای ثبت رویدادهای نرم افزار، ماژول logging با RichHandler و ذخیره مناسب لاگ انتخاب دقیق تریه.
آموزش Rich پایتون با مثال برای چه پروژه هایی مناسبه؟
برای ابزارهای خط فرمانی مثل گزارش فایل، بررسی وضعیت سرویس خودت، نمایش نتیجه پردازش و اسکریپت های مدیریت سیستم. نمونه پروژه پایانی این مقاله رو اول اجرا کن و بعد با داده واقعی خودت گسترشش بده.
رنگی کردن خروجی پایتون بدون ANSI دستی چطور انجام می شه؟
برای بیشتر سناریوها به جای کدهای خام ANSI می تونی از rich.print یا Console استفاده کنی. Rich تشخیص می ده ترمینال چه قابلیت هایی داره و خروجی متناسب تولید می کنه.
زیباسازی ترمینال پایتون برای اسکریپت سرور هم جواب می ده؟
برای خواناتر کردن اجرای تعاملی اسکریپت خوبه. اما برای لاگ سرویس دائمی خروجی ساخت یافته و سیستم logging رو هم جدا داشته باش تا رنگ ها جای نگهداری درست داده رو نگیرن.
زیباسازی خروجی پایتون چقدر روی سرعت برنامه اثر داره؟
کارهای نمایشی هزینه پردازشی دارن ولی اثرش به تعداد رندر و نرخ به روز رسانی بستگی داره. خروجی رو در هر تکرار سریع بی دلیل از اول رسم نکن و روی داده زیاد خودت اندازه بگیر.
برای ساخت جدول در ترمینال پایتون با داده CSV چه کنم؟
با ماژول csv داده رو بخون و برای هر ردیف از Table.add_row استفاده کن. اگر داده خیلی زیاده بهتره صفحه بندی، فیلتر یا محدود کردن ردیف ها رو هم در نظر بگیری.
نوار پیشرفت در پایتون برای دانلود فایل هم کار می کنه؟
بله، به شرطی که مقدار دانلود شده واقعی رو به Progress اعلام کنی. برای دانلودی که اندازه نهایی معلوم نیست، Status یا نمایش حجم دریافتی مناسب تر از درصد ساختگیه.
آیا آموزش کتابخانه Rich در پایتون به درد ابزارهای هک قانونی هم می خوره؟
بله، برای نمایش گزارش بررسی های مجاز، وضعیت کارها و دسته بندی یافته ها خوبه. Rich خودش عملیات تست نفوذ انجام نمی ده و مجوز انجام بررسی همچنان لازمه.
چرا در آموزش Rich پایتون از مثال مدیریت فایل استفاده شد؟
چون یه کار محلی، قابل فهم و بدون نیاز به سرویس خارجی رو یاد می گیری که جدول، Progress و مدیریت خطا رو یکجا نشان می ده. بعدا می تونی همین قالب نمایش رو به ابزار دیگه منتقل کنی.
برای رنگی کردن خروجی پایتون در VS Code کجا اجرا کنم؟
در ترمینال یکپارچه VS Code معمولا رنگ ها قابل نمایش هستن. اگر توی Output یا محیط Debug با تفاوت مواجه شدی، کد رو داخل Windows Terminal یا Terminal سیستم امتحان کن.
آیا زیباسازی ترمینال پایتون جای تست و دیباگ را می گیره؟
نه. Rich فقط خروجی و خطاها رو خواناتر می کنه. تست درست، بررسی Exception، صحت داده و اندازه گیری عملکرد همچنان وظیفه برنامه نویسه.
آموزش کتابخانه Rich در پایتون و RichHandler چه ارتباطی دارن؟
این Handler به سیستم logging استاندارد پایتون وصل می شه و نمایش لاگ داخل ترمینال رو مرتب می کنه. برای ذخیره یا ارسال لاگ باید Handler و سیاست نگهداری مناسب داشته باشی.
آموزش Rich پایتون برای ساخت ابزار خط فرمان چه مزیتی داره؟
با چند کلاس آماده می تونی پیام، جدول، Progress و وضعیت کار رو یکدست نشون بدی. لازم نیست رنگ و فاصله همه ستون ها رو دستی مدیریت کنی.
برای زیباسازی خروجی پایتون کدهای قبلی رو دور بریزم؟
نه. می تونی مرحله ای پیش بری: اول فقط بخش پیام ها رو با Console مرتب کن، بعد در صورت نیاز جدول یا نوار پیشرفت اضافه کن.
ساخت جدول در ترمینال پایتون با خروجی فارسی ممکنه؟
بله، اما نمایش راست به چپ به فونت و ترمینال هم بستگی داره. برای جدولی که قراره منتشر بشه حتما خروجی رو روی ترمینال هدف تست کن.
برای نوار پیشرفت در پایتون حلقه for لازمه؟
نه همیشه. با Progress می تونی از هر جایی که کار واقعی جلو می ره میزان پیشرفت رو update کنی. track برای حلقه های ساده راحت تره.
رنگی کردن خروجی پایتون با Rich در پروژه امنیتی مشکلی داره؟
خیر، تا وقتی اطلاعات حساس رو توی خروجی چاپ نکنی و داده ناشناس رو بدون تفسیر Markup نمایش بدی. Rich فقط نمایش رو بهتر می کنه، نه امنیت ابزار رو.
زیباسازی ترمینال پایتون در WSL هم جواب می ده؟
بله، Rich داخل محیط پایتون WSL هم کار می کنه و نمایش نهایی به ترمینالی بستگی داره که WSL رو داخلش باز کردی.
اگر بخوام Rich رو بیشتر یاد بگیرم چیکار کنم؟
مثال های جدول، نوار پیشرفت و لاگ این مقاله رو اجرا کن و بعد پروژه پایانی رو با فیلتر فایل و خروجی CSV توسعه بده. مستندات رسمی Rich هم مثال های بیشتری داره.
جمع بندی: از ترمینال ساده تا ابزار قابل استفاده
اگه تا اینجا اومدی، حالا می دونی برای زیباسازی برنامه های پایتون لازم نیست از اول یه رابط گرافیکی بسازی. با کتابخانه Rich در پایتون می تونی خروجی رنگی، جدول، نوار پیشرفت، کادر، نمایش JSON و خطای مرتب داشته باشی. مهم تر اینکه یاد گرفتی هر قابلیت کجا واقعا مفیده و کجا نباید فقط دنبال ظاهر خوشگل باشی.
پیشنهاد می کنم همین الان یه پوشه آزمایشی بسازی و پروژه گزارش فایل رو اجرا کنی. بعدش خودت یک قابلیت بهش اضافه کن، مثلا نمایش بزرگ ترین فایل ها یا ذخیره گزارش CSV. وقتی بتونی یه ابزار ساده رو از مرحله ایده تا اجرا کامل کنی، پایتون برات از چند تا دستور حفظی تبدیل می شه به چیزی که واقعا به کارت میاد.
اگه دوست داشتی توی پایتون جدی تر جلو بری، اول مهارت های پایه رو محکم کن، بعد برو سراغ پروژه های واقعی. دوره ها و آموزش های نابغه ها رو هم می تونی به عنوان مسیر ادامه کار بررسی کنی، ولی قبلش همین تمرین رایگان رو انجام بده؛ از نتیجه اش خیلی چیزها دستت میاد.
راستی اگه دوست داری امکانات Rich رو تصویری ببینی، ویدیوی آموزشی پایین رو هم ببین. توی ویدیو علاوه بر خود کتابخانه، چند تا مفهوم کاربردی پایتون رو هم روی مثال می بینی. می تونی همزمان کدهای بالای صفحه رو توی ترمینال اجرا کنی تا فقط تماشاگر نباشی.
اگه میخوای این موضوع رو جدیتر یاد بگیری، مسیر کاملش اینجاست.
دورهها موضوع رو از پایه تا اجرای واقعی، پروژه و نکتههایی که وسط کار بهشون میرسی جلو میبرن.
نظرها و تجربهها
سؤال، تجربه یا نکتهای درباره این مقاله داری؟ اینجا بنویس تا گفتوگو برای بقیه هم مفید بمونه.
میم خوبی بود 🙂