رنگ‌ولعاب درترمينال‌های‌گنگ
آموزش کار با زبان برنامه‌نويسی پايتون (بخش دهم)
اگر سن شما به اندازه‌ای باشد که نخستین روزهای کامپیوترها را به یاد بیاورید، به یاد خواهید داشت که در آن دوران کامپیوترها اغلب مین‌فریم بودند و «ترمینال‌های گنگ» به عنوان دستگاه‌های ورودی و خروجی به آن‌ها متصل می‌شدند. شما می‌توانستید به هر تعداد ترمینال که می‌خواهید به یک مین‌فریم متصل کنید. مشکل این‌جا بود که ترمینال‌ها واقعاً گنگ بودند! در آن‌ها خبری از پنجره‌ها، رنگ و هیچ چیز دیگری نبود. تنها در بهترین حالت صفحه‌ای با 24 سطر 80 کاراکتری در اختیار شما قرار می‌گرفت. در نخستين روزهای DOS و CPM نیز اوضاع به همین منوال بود. زمانی که برنامه‌نویسان آن زمان روی صفحات زیبا و تجملی به‌ویژه برای ورود و خروج داده‌ها کار می‌کردند، از کاغذهای شطرنجی برای طراحی صفحه استفاده می‌کردند. هر مربع نشانه یک کاراکتر بود. اکنون نیز زمانی که شما با برنامه‌های پایتون در ترمینال کار می‌کنید (که بیشتر اوقات چنین خواهد بود) اوضاع به همان منوال است. اما هر مشکلی با پیش‌بینی و کسب آمادگی لازم قابل حل خواهد بود، پس کاغذهای شطرنجی‌تان را آماده کنید تا به سراغ نخستین برنامه Curses خودمان برویم.

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


برای مطالعه قسمت‌های قبلی سلسله مقالات آموزش زبان برنامه‌نویسی پایتون اینجا کلیک کنید


کدهای فهرست 1 را در ویرایشگر دلخواهتان وارد کرده، با نام Curse.py ذخیره و سپس اجرا کنید. خواهید دید که همانند شكل 1 کادری در اطراف پنجره ترمینال ترسیم می‌شود و متن مورد نظر ما در سطر دوازدهم و از محل کاراکتر بیست و پنجم به نمایش در خواهد آمد. در خط 1 ما کتابخانه curses را فراخوانده‌ایم. پس از آن و در خط 2 شیء از نوع صفحات curses با نام myscreen ایجاد و برای استفاده آماده کرده‌ایم. این صفحه درواقع بوم نقاشی ما خواهد بود. پس از آن در خط‌3 و با عبارت  (myscreen.border(0  کادری را در اطراف صفحه نمایش ترسیم کرده‌ایم. این کار الزامی نیست، اما ظاهر برنامه ما را زیباتر می‌کند. پس از آن و در خط 4 با تابع ()addstr  و مشخص کردن مکان نقطه شروع متنی را به صفحه نمایش افزوده‌ایم. تابع ()addstr در واقع همانند دستور print عمل خواهد کرد. اما تا این لحظه هیچ‌کدام از اعمال انجام شده روی صفحه نمایش قابل مشاهده نخواهند بود. برای نمايش این تغییرات باید مانند خط 6  از تابع ()Refresh استفاده کرد. پس از آن و در خط 7 با تابع ()getch منتظر فشرده شدن یک کلید از سوی کاربر مانده‌ایم و در نهايت با تابع ()endwin صفحه نمایش را آزاد کرده‌ایم تا ترمینال ما به عملکرد عادی خود بازگردد. توجه داشته باشید که دستور endwin بسیار مهم است. اگر این تابع فراخوانده نشود، ترمینال شما دیگر قابل استفاده نخواهد بود، پس همواره مطمئن شوید که این تابع درست قبل از پایان برنامه شما فراخوانده شده است. نکته دیگری که به احتمال متوجه آن شده‌اید این است که کادر یا border ما حاشیه‌ای به عرض یک کاراکتر را اشغال خواهد کرد.

import curses
myscreen = curses.initscr()
myscreen.border(0)
myscreen.addstr(10,12,»This Is\
The Simple Test . . .»)
myscreen.refresh()
myscreen.getch()
curses.endwin()

فهرست 1- نمونه ساده كار با كتابخانه curses

شکل 1- نتيجه اجرای كدهای فهرست يك

به ياد داشته  باشيد شمارش سطرها و ستون‌های صفحه نیز همواره از صفر آغاز خواهد شد. به عبارت دیگر، بالاترین نقطه در سمت چپ صفحه مختصاتی برابر 0,0 خواهد داشت.
حال که با اصول کلی کار با curses آشنا شدیم، بیایید از این کتابخانه برای ایجاد پوسته ارتباطی یک برنامه فرضی دفتر تلفن استفاده کنیم. در این مثال ما عملاً از کدهای مربوط به منطق درونی برنامه که برای افزودن نام و شماره به دفتر تلفن، جست‌وجوی نام‌ها، حذف رکوردها و نحوه نگه‌داری و ذخیره‌سازی داده‌ها صرف‌نظر کرده و تنها روش پیاده‌سازی يك پوسته یا رابط کاربری ساده را با curses توضیح خواهیم داد. 
کدهای فهرست شماره 2 را در ویرایشگر دلخواهتان وارد کرده و با نام PhonebookUI.py ذخیره و اجرا کنید. در این حالت با صفحه‌ای مشابه شكل 2 مواجه خواهید شد که در واقع منوی اصلی برنامه دفتر تلفن را نمایش می‌دهد. در این مرحله با فشردن کلیدهای 1، 2 و 3 می‌توانید به منوهای مربوط به هر بخش وارد شده و عملیات مورد نظر را انجام دهید یا با وارد کردن عدد 0 از برنامه خارج شوید.
 کدهای فهرست 2 از چهار بخش اساسی تشکیل شده است. در بخش نخست ما تنها import برنامه را برای استفاده از کتابخانه curses انجام داده‌ایم.
در بخش بعدی تابعی با نام MainMenu را تعریف کرده‌ایم. این تابع ابتدا در خط 6 و با تابع ()erase صفحه نمایش (که قبلاً توسط curses تعریف شده است) را پاک می‌کند. حاشیه یا کادر در خط 7 فعال می‌شود. پس از آن و با استفاده از چندین تابع ()addstr شکل منوی اصلی را روی صفحه نمایش ترسیم کرده‌ایم. در این بخش شما می‌توانید فرم کامل تابع ()addstr را مشاهده کنید. این تابع در حالت عادی 4 آرگومان دریافت می‌کند. دو آرگومان نخست شماره سطر و ستون محل نوشته شدن متن هستند. آرگومان سوم، متن مورد نظر را تعریف می‌کند و در نهایت آرگومان چهارم رنگ متن را مشخص می‌کند. رنگ‌های مورد نظر برای استفاده در ()addstr به صورت جفت رنگ‌های پیش‌زمینه و پس‌زمینه هستند که در مورد نحوه تعریف آن‌ها کمی بعدتر توضیح خواهیم داد.
در بخش سوم تعریف تابع GetKey آورده شده است. ما از این تابع برای دریافت پاسخ کاربر و واکنش به آن استفاده می‌کنیم. در خط 27 یک حلقه while تعریف شده است و تا زمانی که کاربر کلید 0 را فشار ندهد، به کار خود ادامه خواهد داد. اگر کاربر کلید 0 را بزند، این حلقه و در نتیجه اجرای تابع به پایان خواهد رسید و کنترل به بخش فراخواننده (در این مثال حلقه اصلی) بازگردانده می‌شود. همان‌طور که پیش‌تر هم گفتیم، در اینجا از پیاده‌سازی کامل برنامه صرف‌نظر کرده‌ایم و تنها محل‌هایی را که باید کدهای منطق برنامه آورده شوند (خط‌های 34،31 و 37) مشخص کرده‌ایم. تنها نکته جديد در مورد تابع GetKey شاید استفاده از تابع ()ord باشد. تابع ()ord با دریافت یک رشته تک کاراکتری، عدد متناظر یونی‌کد آن را بازمی‌گرداند. استفاده از این تابع باعث می‌شود که برنامه بتواند فشرده شدن کلید 1 را در همه آرایش‌های صفحه کلید (مثلاً فارسی یا عربی) درک کرده و به آن واکنش نشان دهد.بدنه اصلی بخش آخر کدهای ما است. در این بخش همانند مثال قبلی ابتدا در خط 40 صفحه نمایش راه‌اندازی شده است. خط 41 به curses اعلام می‌کند، ما قصد استفاده از رنگ در نوشتن متن‌ها را داریم. در صورت عدم استفاده از تابع ()start_color هر تلاشی برای نمایش متون رنگی روی صفحه نمایش بی نتیجه خواهد ماند. نکته مهم دیگر این است که این دستور باید بعد از ایجاد و آماده‌سازی صفحه نمایش توسط تابع ()initscr مورد استفاده قرار بگیرد.


شکل 2-  نحوه نمايش يك منوی رنگی با كدهای فهرست 2

همان‌گونه که پیش‌تر هم اشاره شد برای ایجاد متون رنگی ما باید از جفت رنگ‌های مخصوص curses استفاده کنیم. خطوط 42 تا 45 این کار را انجام می‌دهد. برای تعریف جفت‌های رنگی از تابع ()init_pair استفاده می‌کنیم که سه آرگومان را قبول می‌کند. آرگومان نخست شماره جفت رنگی را مشخص می‌کند. آرگومان دوم رنگ متن یا پیش‌زمینه را مشخص‌کرده و آرگومان سوم رنگ پس‌زمینه را تعیین می‌کند. برای معرفی این رنگ‌ها ما از ثابت‌های نام‌دار خود کتابخانه curses استفاده کرده‌ایم. همان‌گونه که مشاهده می‌شود، این ثابت‌ها از ترکیب curses.COLOR_ با نام رنگ مورد نظر (با حروف بزرگ) به وجود آمده‌اند.
تنها نکته جدید دیگر در این برنامه قالب try . . . except . . . finally است. این ساختار کنترلی معمولا برای جلوگیری از بوجود آمدن خطا در برنامه‌ها و متوقف شدن برنامه استفاده می‌شود. فرم ساده استفاده از این دستورات بدین صورت است که پس از کلمه کلیدی try مجموعه دستوراتی که ممکن است باعث بروز خطا شوند آورده می‌شود. مجموعه کدهای مدیریت کننده خطا نیز پس از کلمه کلیدی except نوشته می‌شود. در نهایت هم دستوراتی که در هر صورت (چه با بروز خطا و چه بدون آن) باید اجرا شوند پس از کلمه کلیدی finally آورده می‌شود. مثال زیر نمونه‌ای از کاربرد این دستور را نشان می‌دهد:

a=input()
b= input()
try:
    c=a/b
except:
    print "division by zero ."
    c="Nothing"
finally:
    print c

در بخش‌های بعدی این مجموعه درباره این قالب به‌صورت مفصل توضیح خواهیم داد.

#! /usr/bin/env python
# ======= curses ========
import curses
# ======== Main Menu ============
def MainMenu():
myscreen.erase()
myscreen.border(0)
myscreen.addstr(8,10, “=====================================”)
myscreen.addstr(9,10, “         Phone Book Menu”)
myscreen.addstr(10,10, “=====================================”)
myscreen.addstr(11,10, “1- Add new name to the book”,curses.color_pair(1))
myscreen.addstr(12,10, “2- Search for a name in the book”,curses.color_pair(2))
myscreen.addstr(13,10, “3- Delete a name from the book”,curses.color_pair(3))
myscreen.addstr(14,10, “0- EXIT”,curses.color_pair(4))
myscreen.addstr(15,10, “=====================================»)
myscreen.addstr(16,10, “Your choice:   “)
myscreen.refresh()
# ======== Get Key ============
def GetKey():
key=”X”
while key != ord(‘0’):
key = myscreen.getch(16,25)
#بخش كنترل كليد فشرده شده 
if key == ord(‘1’):
## روال افزودن نام و شماره آورده شود
pass
if key == ord(‘2’):
## روال جست‌وجو آورده شود
pass
if key == ord(‘3’):
## روال حذف آورده شود
pass
# ======= Main Part ========
myscreen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_BLUE,curses.COLOR_WHITE)
curses.init_pair(2, curses.COLOR_GREEN,curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_CYAN,curses.COLOR_MAGENTA)
curses.init_pair(4, curses.COLOR_RED,curses.COLOR_WHITE)
myscreen.border(0)
 
try:
MainMenu()
GetKey()
 
finally:
curses.endwin()

فهرست 2- كدهايی برای نمايش منوی رنگی يك نرم‌افزار فرضی دفتر تلفن

هرچند مثال‌های این بخش بسیار ساده و ابتدایی هستند، اما شما را با اصول اولیه آرایش متن‌ها در صفحه و استفاده از رنگ‌ها و... آشنا می‌کند. شما هم به احتمال بسیار پیش‌تر به این نتیجه رسیده‌اید که داشتن توانایی ایجاد چنین رابط‌های کاربری آن هم در زبان‌های اسکریپت‌نویسی مانند پایتون که به‌صورت معمول از رابط‌های‌گرافیکی استفاده نمی‌کنند بسیار حیاتی و لازم است و کتابخانه curses برای شروع و حتی در حالتی که با برنامه‌های حرفه‌ای سروکار دارد گزینه مناسبی خواهد بود. 

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

کتاب الکترونیک دوره مقدماتی آموزش پایتون

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟