کتابخانه ی menufather 1.0 :: Mr Python | مستر پایتون

کتابخانه ی menufather 1.0

  • ۵۴۹

menufather 1.0 در پایتون برای ساخت منو در کنسول

به وسیله ی کتابخونه ی menufather میتونید به راحتی در کنسول و محیط CLI منو بسازید (windows / linux)

این کتابخونه بسیار کم حجمه و همچنین کار باهاش خیلی خیلی راحته .

 

۱ . نصب کتابخانه :‌

WINDOWS

> pip install menufather

 

 LINUX

MrPython@debian:~$ pip3 install menufather

 

۲ . ساخت اولین منو :‌

پس از ایمپورت کردن کتابخانه های مورد نیاز (time برای ایجاد تاخیر) ، عنوان یا title منو مورد نظرمون رو تعریف میکنیم و داخل متغییر title میریزیم (خط  ۴) . سپس آیتم های منو رو داخل یک لیست به نام items قرار میدیم (خط ۵) .

حالا همه چیز اماده است . باید منو رو بسازیم . برای اینکار menufather.Menu رو فراخونی کردیم که برامون منو میسازه (خط ۶) . این تابع دو ورودی میگیره . اولین ورودی title هستش که همون عنوانی رو بهش دادیم که در خط ۴ تعریف کردیم . ورودی بعدی آیتم های منو هستش که items تعریف شده در خط ۵ رو به اون دادیم و نهایتا منو ساخته شده رو داخل متغییر menu ذخیره کردیم .

حالا باید با استفاده از تابع menu.show منویی که ساختیم رو نمایش بدیم (خط ۷)

تا اینجا منوی خودمون رو ساختیم در قدم بعدی باید یک loop برای برناممون بنویسیم که در اون دائما منتظر بمونیم کاربر یکی از آیتم های منو رو انتخاب کنه و با توجه به اون برناممون واکنش نشون بده . برای اینکار یک حلقه while True نوشتیم (خط ۹) .

دقت کنید داخل حلقه بینهایتمون حتما باید یک تاخیر (ترجیحا بین نیم تا یک ثانیه) وجود داشته باشه . برای همین اول حلقه یک تاخیر ۱ ثانیه ای قرار دادیم . حالا میتونیم خیلی راحت آیتم انتخاب شده کاربر رو دریافت کنیم . برای اینکار تابع menu.get_selected_item رو فراخونی میکنیم . اگر کاربر در اون لحظه آیتمی رو انتخاب کرده بود ، این تابع اندیس اون آیتم در لیست items که بالاتر تعریف کردیم رو برمیگردونه در غیر این صورت یک None بر میگردونه . در خط ۱۱ ما از این تابع استفاده کردیم و آیتم انتخاب شده رو گرفتیم و ریختیم داخل متغییر selected .حالا چک کردیم اگه برابر با None نبود (یعنی یه چیزی انتخاب شده) ، از حلقه خارج بشه و اسم آیتم انتخاب شده رو بنویسه .

نکته کنکوری :‌ دقت کنید هر بار که تابع menu.get_selected_item رو فراخونی میکنیم ، اگه آیتمی انتخاب شده بود ، اونو برمیگردونه و از حافظه خودش حذف میکنه . یعنی دفعه بعدی که فراخونی میشه این تابع حتما None رو برمیگردونه . به عبارتی کتابخونه آیتم انتخاب شده رو نگه میداره تا زمانی که شما یک بار menu.get_selected_item رو فراخونی کنید . برای همین همون اول کارتون تو حلقه یک بار اونو داخل یه متغییری مثل selected ذخیره کنید که همیشه در طول حلقه داشته باشیدش .

بعد از اجرای سورس بالا :

همینطور که میبینید منو برای ما ساخته شده . با استفاده از کلید های جهت روی کیبورد میشه داخل این منو بالا و پایین رفت .

۳ . قفل و آزاد کردن منو :‌

با استفاده از تابع های ()menu.lock و ()menu.unlock به ترتیب میتونید منو رو قفل کنید یا اونو باز و آزاد کنید . اگه منو قفل بشه کاربر دیگه کاری نمیتونه داخلش انجام بده . نه میتونه بالا پایین بره (با کلید های جهت) و نه چیزی انتخاب کنه .

 

۴ . ویرایش آیتم های منو :‌

اگه جایی نیاز داشتیم همینطور که منو در حال اجرا هستش یکی از آیتم های اون تغییر کنه و ویرایش بشه اسمش ، میتونیم از تابع

(itemIndex , new)menu.updateItem استفاده کنیم . این تابع دو ورودی میگیره . اولیش اندیس اون آیتمی هستش داخل لیست items که میخوایم تغییرش بدیم . دومیش هم اسم جدید اون آیتم هست که میخوایم آیتم قبلی به این اسم تغییر پیدا کنه .

مثال :‌

menu.updateItem(2 , "Contact")

دستور بالا اندیس دوم از آیتم های منو رو اسمشو به Contact تغییر میده . 

 

۵ . بازسازی منو ها :‌

گاهی اوقات هستش که ما میخوایم وقتی کاربر یکی از آیتم های منو رو انتخاب میکنه ، یک منو جدید براش باز بشه . تو این موارد میتونیم از قابلیت بازسازی منو ها در کتابخانه استفاده کنیم . به این صورت که منوی فعلی که داریم (متغییر menu) رو تمام آیتم ها و عنوانشو عوض میکنیم و یک منو جدید پدید میاد . برای اینکار میتونیم از تابع (new_title , new_items)menu.reCreate استفاده کنیم . این تابع دو ورودی میگیره . ورودی اول عنوان جدید هستش و ورودی دوم لیست آیتم های جدید هستش . بعد فراخونی این تابع منو بازسازی میشه .

مثال :‌

بعد از اجرای سورس بالا ، در ابتدا یک منو داریم که یه آیتمی داره به نام "goto menu 2" بعد از انتخاب این آیتم ، وارد یک منو جدید میشیم .

 

۶ . اسکرول خودکار :‌

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

 

امیدوارم مفید واقع بشه . سوالی بود در بخش نظرات مطرح کنید .

همچنین خیلی خوشحال میشیم اگه شما دوستان عزیز به پیشرفت این پروژه کمک کنید .

لینک گیت هاب کتابخانه : https://github.com/mrpythonblog/menufather

 

یا حق !

Telegram Channel : @mrpythonblog

 

  • یک فرد نسبتا معمولی

    سلام

    لطفا رو به روز رسانی هاش کار کنید خیلی چیز خوبی هست

    من پایتون ۳.۱۰ داشتم اما ارور میداد. رفتم کدهاشو دیدم.شما از pywin32 استفاده کرده

    بودید که فقط تا پایتون ۳.۶ جواب میداد.

    بنابراین من کدهارو کمی دستکاری کردم و از کتابخانه pygetwindow استفاده کردم.

    کتابخانه مذکور در سایت pypi:

    https://pypi.org/project/PyGetWindow/

    البته برخی از کدهای دیگه رو هم کمی تغییر دادم تا بتونم اجرا کنم.

    پاسخ:
    سلام . 
    مچکرم بابت پیگیری . 
    درست میگید باید بروزرسانی بشه . 
    روش کار میکنیم :) .
  • سلام خسته نباشی

    اون {} :

    print("selected item : {}".format(items[selected]))

    نقشش چیه؟

    پاسخ:
    سلام . سلامت باشی 
    اینو بهش میگن String Formating . چیزی که داخل پرانتز جلوی format نوشتم ، میره به جای {} قرار میگیره . یه روش برا جایگذاری یه چیزی داخل یه استرینگه . تو دوره پایتونمون بخش مربوط به استرینگا توضیحش دادیم . تو اینترنتم هست جستوجو کنی
  • اقا فیلتر شدن vscode و python رو تسلیت میگم

    از این به بعد با سختی خیلی قبل از قبل باید برنامه نویسی کنیم

     

    پاسخ:
    رفیق بی کلک vim ...
  • خیلی خفنی 

    به ندرت توی سایتی کامنت میزارم 

    ولی شما باید بدونی اکثر پروژه هات عالیه 

    فقط یه سوال دارم چطور میتونم پرین رو به صورت حالت اینکه داره تایپ میکنه خروجی بگیرم 

    با استفاده از for

    پاسخ:
    سلام و درود . 
    از لطفتونه . 
    ممنون که کارای مارو دنبال میکنید

    این سورس رو امتحان کنید :

    from time import sleep
    import sys message = "Hello . How are you ?" delay = 0.05 # delay between printing each character (seconds)
    for char in message: print(char , end="")
    sys.stdout.flush() # Flush stdout buffer
    sleep(delay)

  • کتابخونه عالیه خیلی ساده ولی در عین حال پیشرفته و خوب

    پاسخ:
    مچکرم که بازدید کردی :)
  • پروژه خودته؟ عالیه داش ادامه بده

    پاسخ:
    بله عزیز . حتما :)
  • سلام , خیلی مطلب خوبی بود :)

    پاسخ:
    سلام . خیلی ممنون که بازدید کردی :)
  • کار با هاش ساده به نظر میرسه. ولی جالب تر می شد اگر به شیوه callback مثل بیشتر کتابخانه های GUI یا TUI باشه.

    با ncurses نوشته شده؟ 

    پاسخ:
    بله سعی شده خیلی ساده باشه . احتمال داره که تو آپدیت های بعدی این اتفاق بیفته :)
    نه منظق و الگوریتم منو از صفر پیاده سازی شده به غیر از colorama برای رنگ و pynput  برای گرفتن کلید های فشرده شده .
  • عالیه , خسته نباشید 

    پاسخ:
    درود بر شما .
    مچکرم شمام خسته نباشید .
  • محمد صادق عبداللهی

    خودتون نوشتید؟😦

    کم پیدا هستید

    پاسخ:
    سلام . بله :)
    از این به بعد پیوسته فعالیت میکنیم بنابه دلایلی چند وقت خیلی نمیتونستیم فعالیت کنیم :)
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی