kivy چیست؟ – معرفی و توضیح کامل فریمورک کیوی + نمونه پروژه

۱۶۴۱ بازدید
آخرین به‌روزرسانی: ۲۰ خرداد ۱۴۰۳
زمان مطالعه: ۲۶ دقیقه
kivy چیست؟ – معرفی و توضیح کامل فریمورک کیوی + نمونه پروژه

Kivy کتابخانه‌ای اوپن سورس محسوب می‌شود که به منظور توسعه «رابط کاربری گرافیکی» (GUI) به‌کار می‌رود و می‌تواند از چندین پلتفرم پشتیبانی کند. به‌طور کلی، توسعه برنامه‌های کاربردی ساخته شده با استفاده از کتابخانه Kivy بسیار جذاب و ارزشمند است. ما در این مطلب از مجله فرادرس با کتابخانه Kivy به منظور توسعه برنامه‌های کاربردی با زبان برنامه نویسی پایتون آشنا خواهیم شد. بنابراین در ابتدا به صورت کامل به این موضوع می‌پردازیم که Kivy چیست و مزایا و معایب آن را مورد بررسی قرار می دهیم. سپس، روش نصب Kivy و پیاده‌‌سازی یک نمونه پروژه را آموزش خواهیم داد و در انتها، مروری بر معماری و اجزای سازنده اصلی آن خواهیم داشت. لازم به ذکر است که برای یادگیری این مطلب آموزشی بهتر است با زبان برنامه‌نویسی پایتون آشنایی اولیه داشته باشید.

997696

Kivy چیست؟

در میان زبان‌های برنامه‌نویسی، پایتون از بهترین‌ها محسوب می‌شود که از دلایل مهم این برتری، پشتیبانی عالی کتابخانه‌های آن از ساخت برنامه‌هایی با عملکرد بهتر، رابط کاربری با قابلیت‌های شگفت‌انگیز، پایداری و امکانات فراوانی است که آنها را از سایر برنامه‌ها متمایز می‌کند. یکی از این کتابخانه‌ها، Kivy در زبان پایتون است که به‌ عنوان کتابخانه‌ای اوپن سورس برای توسعه رابط کاربر گرافیکی (GUI) به کار می‌رود و امکان پشتیبانی از چندین پلتفرم را فراهم می‌کند. بنابراین، در سیستم عامل‌هایی همچون iOS، ویندوز، اندروید، لینوکس، macOS، «رزبری پای» (Raspberry Pi) و غیره اجرا می‌شوند.

این کتابخانه توسط شرکت Kivy توسعه یافته و «رابط کاربری» (UI) ارائه شده، به توسعه برنامه‌های کاربردی کاربرپسند بسیار کمک می‌کند. این چارچوب تحت مجوز MIT عرضه شده و به صورت کاملا رایگان قابل استفاده می‌باشد. فریمورک کیوی از «پایداری» (Stability) و «رابط برنامه‌نویسی کاربردی» (Application Programming Interface| API» مناسبی برخوردار است. همچنین موتور گرافیکی این ابزار بر پایه OpenGL ES2 ساخته شده و از پایپلاینی سریع و مدرن استفاده می‌کند. احتمالا بدانید که «پایپلاین» (Pipeline)در مهندسی نرم‌افزار، به مجموعه‌ای از فرآیندها گفته می‌شود که در آن داده‌ها یا ورودی‌ها از یک عنصر پردازشی گرفته شده و پس از اعمال یک سری اقدامات یا تغییرات به عنوان ورودی به عناصر بعدی منتقل می‌شود.

فریمورک Kivy بیش از ۲۰ «ویجت» (Widget) فراهم کرده است و همه آنها قابلیت «توسعه‌پذیری» (Extensibility) بالایی دارند. به‌طور کلی، توسعه برنامه کاربردی با استفاده از این کتابخانه، برنامه‌های کاربردی تعاملی با رابط کاربری گرافیکی ساده‌ای ایجاد می‌کند که استفاده از برنامه را برای کاربران آسان می‌کند. مزیت اصلی کتابخانه Kivy، مستقل بودن آن از سیستم‌عامل است. این بدان معناست که برنامه‌های توسعه‌یافته با Kivy می‌توانند بر روی انواع مختلفی از پلتفرم‌ها اجرا شوند. با استفاده از این امکان، توسعه‌دهندگان می‌توانند از کد‌های قبلی، بدون نیاز به تغییرات زیاد دوباره استفاده و در پلتفرم‌های مختلف اجرا کنند که این ویژگی باعث سهولت و کارایی در توسعه و اجرای برنامه‌های کاربردی خواهد بود.

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

  • کامپیوتر‌های دسکتاپ: شامل سیستم‌عامل‌های macOS، لینوکس، BSD Unix و ویندوز می‌شود.
  • سیستم‌های iOS: مانند iPad و iPhone می‌باشد.
  • سیستم‌های اندورید: تبلت‌ها و گوشی‌های همراه را شامل می‌شود.
  • سیستم‌های حرفه‌ای چند لمسی: که از «اشیا رابط کاربری محسوس» ( Tangible User Interface Objects | TUIO) پشتیبانی می‌کنند.

مزایا و معایب Kivy چیست؟

در قسمت قبلی به این موضوع پرداختیم که فریمورک Kivy چیست، حال می‌خواهیم به مزایا و معایب این کتابخانه بپردازیم. به‌طورکلی، رابط‌ کاربری گرافیکی (Graphical User Interface | GUI) نقش مهمی در تولید برنامه‌های کاربرپسند ایفا می‌کند. زبان برنامه‌نویسی پایتون چندین گزینه برای ساخت GUI ارائه می‌دهد که هر کدام ویژگی‌ها و امکانات خاص خود را دارا هستند. Tkinter ،Pyqt و Kivy سه ماژول محبوب و مطرح GUI در پایتون هستند که انتخاب هر یک از این ۳ مورد به عوامل مختلفی نظیر میزان پیچیدگی پروژه، نیازهای پلتفرم و غیره بستگی دارد.

برای مثال، کتابخانه Tkinter می‌تواند انتخاب خوبی برای شروع کار با رابط کاربر گرافیکی برای مبتدیان باشد. کتابخانه Pyqt نیز قابلیت فراوانی را برای برنامه‌های با امکانات سفارشی بیشتر فراهم می‌کند. همچنین Kivy به خاطر قابلیت‌های چندپلتفرمی و رویکرد منحصر به فرد خود در طراحی رابط کاربری می‌تواند بهترین گزینه محسوب شود. حال در ادامه به این می‌پردازیم که مزایا و معایب فریمورک Kivy چیست تا با دید بهتری بتوانیم کتابخانه مناسبی برای توسعه رابط کاربر گرافیکی برنامه مدنظرمان انتخاب کنیم.

مزایای کتابخانه Kivy چیست؟

در فهرست زیر مزایای کتابخانه Kivy را بیان کرده‌ایم.

  • پشتیبانی از چند پلتفرمی و رابط‌های لمسی: فریمورک Kivy در ایجاد برنامه‌هایی که بر روی چندین پلتفرم اجرا می‌شوند و از رابط‌های لمسی، پشتیبانی می‌کند عملکرد بسیار خوبی دارد و این امکان را به برنامه‌نویسان می‌دهد تا برنامه‌های تلفن همراه و تبلت بسازند.
  • رویکرد نوآورانه: رویکرد منحصر به فرد فریمورک Kivy در توسعه رابط‌های کاربری با استفاده از زبان طراحی Kv ، این کتابخانه را متمایزتر می‌‌کند و باعث کاهش تعداد خطوط کد و بهبود قابلیت خوانایی آن شود که در نتیجه موجب توسعه سریع‌تر برنامه می‌شود.
  • انعطاف‌پذیری بالا: Kivy امکان ایجاد رابط‌های کاربری منحصربه‌فرد و سفارشی را فراهم می‌کند، در مقابل هم به توسعه‌دهندگان این امکان را می‌دهد که رابط‌های کاربری بسازند که به نحوی به برنامه‌های بومی (Native) سیستم‌عامل که در آن برنامه اجرا می‌شود، نزدیک باشد. این شباهت می‌تواند به‌ عنوان مثال، استفاده از المان‌ها، استایل‌ها، و تنظیمات ظاهری باشد که با استانداردهای رابط کاربری بومی همخوانی داشته باشد.

معایب کتابخانه Kivy چیست؟

در ادامه برخی معایب این کتابخانه را آورده‌ایم.

  • در حالی که Kivy مزایای منحصر به فردی را ارائه می دهد، ممکن است جامعه و منابع گسترده‌ای مانند Tkinter یا Pyqt را نداشته باشد.
  • فریمورک Kivy زمان زیادی برای ساخت و کامپایل برنامه‌های موبایل صرف می‌کند.
فردی که برنامه‌نویسی می‌کند

روش نصب Kivy چیست؟

در این قسمت می‌پردازیم که روش نصب Kivy چیست و نحوه نصب کتابخانه Kivy نسخه ۲٫۱٫۱ را آموزش می‌دهیم. لازم است توجه داشته باشیم که این نسخه از بسته Kivy در نسخه ۳٫۷ تا ۳٫۱۱ از پایتون پشتیبانی‌ می‌کند. در یکی از مطالب پیشین فرادرس به‌طور کامل نحوه نصب پایتون را توضیح دادیم. در ابتدا پیشنهاد می‌کنیم که محیطی مجازی برای پروژه Kivy خود ایجاد کنید. محیط مجازی در پایتون این امکان را می‌دهد که برای پروژه‌های خود محیطی مستقل و جداگانه ایجاد کنید و بتوانید نسخه‌های مختلف پایتون و بسته‌های مورد نیاز پروژه خود را به‌طور مستقل داشته باشید، در اینصورت می‌توانید از تداخل‌ها و تضادهای نصب بین پروژه‌ها مختلف جلوگیری کنید. به این منظور در پوشه مورد نظر خود ترمینالی باز کنید و به عنوان مثال، برای ایجاد محیط مجازی به نام Kivy-venv، دستور زیر را وارد کنید.

$ python -m venv kivy_env
این دستور پوشه‌ای به نام Kivy_env می‌سازد که حاوی همه فایل‌های مربوط به محیط مجازی است. نسخه پایتون تعریف شده در این محیط مجازی همان نسخه‌ای است که از خروجی دستور python --version  در ترمینال دریافت می‌کنید. در مرحله بعد نیاز است که محیط مجازی را فعال کنیم و بسته به اینکه از سیستم‌ عامل‌های ویندوز، مک و لینوکس استفاده می‌کنید می‌توانید یکی از دستورات زیر را وارد کنید.

دستور موردنظر ویندوز در زیر آورده شده است.

C:/> .\kivy_env\Scripts\activate
دستور موردنظر برای مک در زیر آورده شده است.

$ source kivy_env/bin/activate
دستور موردنظر لینوکس در زیر آورده شده است.

$ source kivy_env/bin/activate
 سپس می‌توانید در محیط مجازی که ایجاد کردید «بسته» (Package) Kivy را با وارد کردن دستور زیر نصب کنید.

(kivy_env) $ python -m pip install kivy
تا به اینجای کار، بسته Kivy را در محیط مجازی فعال پایتون خود نصب کرده‌ایم و در ادامه می توانیم پیاده‌سازی با این کتابخانه را شروع کنیم.

ایجاد اولین برنامه با استفاده از کتابخانه Kivy

تا اینجا یاد گرفتیم که kivy چیست و نحوه نصب آن را نیز بررسی کردیم، در ادامه، می‌خواهیم به صورت مقدماتی اولین برنامه با استفاده از کتابخانه Kivy را ایجاد کنیم و هدف ما ساخت صفحه‌ای است که متن مورد نظر ما، به عنوان نمونه، «Hello World» را نمایش دهد. برای این مثال نیاز است که که کلاس‌های App و Label را وارد کنیم. به‌طور کلی، کلاس App عملکرد پایه‌ای مورد نیاز برای ایجاد برنامه‌های رابط کاربری مانند، مدیریت حلقه رویداد را فراهم می‌کند و کلاس Label به عنوان عنصر اصلی بصری یا «Widget» (ویجت) برای رابط کاربری ما عمل می‌کند.

1from kivy.app import App
2from kivy.uix.label import Label

در ادامه کلاسی با نام MainApp یا هر نام دلخواه دیگری به‌ عنوان «زیرکلاس» (SubClass) کلاس App می‌سازیم. در واقع اینجا از مفهوم وارثت استفاده می‌شود و همانطور که می‌دانید در برنامه‌نویسی شی‌گرا، «زیرکلاس» (SubClass) می‌تواند ویژگی‌ها و رفتارهایی که در «کلاس اصلی» (SuperClass) تعریف شده‌اند را به ارث ببرند. به‌طور کلی، برای ایجاد رابط کاربری در برنامه‌ نیاز است که مِتُد build را تعریف کنیم که خروجی خود را به عنوان یک شیء از نوع «ویجت» (Widget) یا «چیدمان» (layout) باز می‌گرداند که به‌ عنوان شیء اصلی در ساختار رابط کاربری شما عمل می‌کند. به عبارت دیگر این متد به منظور نمایش دادن هر چیزی می‌باشد که به‌طور مثال در این نمونه، خروجی متد، لیبلی با نوشته «Hello World» است.

1from kivy.app import App
2from kivy.uix.label import Label
3
4class MainApp(App):
5    def build(self):
6        return Label(text="Hello, World!")

در مرحله نهایی، یک شی از کلاس MainApp می‌سازیم و متد run()  را صدا می‌زنیم که متد اصلی در کلاس App به شمار می‌آید و به منظور اجرای برنامه و نمایش رابط کاربری است.

1from kivy.app import App
2from kivy.uix.label import Label
3
4class MainApp(App):
5    def build(self):
6        return Label(text="Hello, World!")
7
8MainApp().run()

در نهایت با اجرای برنامه، خروجی زیر را دریافت می‌کنیم.

code-output

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

 ویجت‌‌ها

«ویجت» (Widget) عنصر اصلی تشکیل دهنده رابط کاربر گرافیکی است که برای نمایش اطلاعات و اجزای مختلف رابط کاربری استفاده می‌شوند و به کاربران این اجازه را می‌دهد که با رابط کاربر گرافیکی برنامه تعامل داشته‌ باشند. برخی از پرکاربردترین ویجت‌های رابط کاربر گرافیکی در برنامه‌های مبتنی بر Kivi شامل موارد زیر هستند.

  •  «برچسب» (Label): این ویجت به منظور نمایش متن در صفحه نمایش به کار می‌رود.
  •  «ورودی متنی» (Text Input): این ویجت به منظور نمایش متنی قابل ویرایش توسط کاربر و با هدف دریافت اطلاعات متنی از او استفاده می‌شود که ویژگی‌های زیر را پیشتیبانی می‌کند.
    1.  کاراکترهای «یونی‌کد» (َUnocode)
    2. «چندخطی» (Multiline)
    3.  «مکان‌نما» (Cursor)
    4.  انتخاب متن و کپی‌برداری
  •  ‌«دکمه» (Button): این نوع ویجت، یکی از عناصر رابط کاربری را فراهم می‌کند که کاربر با فشردن آن، عملیات یا دستوری مشخص را اجرا می‌کند.
  • «چک‌باکس» (CheckBox): این ویژگی یکی از المان‌های رابط کاربری است که امکان انتخاب یا عدم انتخاب یک وضعیت را برای کاربر فراهم می‌کند.
  •  «تصویر» (Image): ویجت تصویر برای نمایش تصویر در رابط کاربر گرافیکی شما استفاده می‌شود.
  • «نوار پیشرفت»(ProgressBar): این المان از رابط کاربر گرافیکی، برای به نمایش گذاشتن پیشرفت کارها استفاده می‌شود و فقط حالت افقی را پشتیبانی می‌کند. این المان حالت تعاملی ندارد و فقط یک ویجت نمایشگر است.
  • «کشویی» (DropDown): این ویجت به صورت یک فهرست کشویی نمایش داده می‌شود و به کابر این امکان را می‌دهد یکی از موارد فهرست را انتخاب کند.

با استفاده از این ویجت‌ها و قابلیت‌های دیگری که فریمورک Kivy فراهم می‌کند، می‌توانید رابط‌های گرافیکی پیچیده و با کیفیت بالا برای برنامه‌هایتان پیاده‌سازی کنید. در ادامه مثال نمایش تصویر با استفاده از ویجت‌ها ارائه می‌دهیم.

نمایش تصویر

فریمورک Kivy چندین ویجت مختلف در رابطه با تصویر دارد، برای مثال، از ویجت تصویر می‌توان به منظور بارگذاری تصاویر موجود در حافظه دستگاه خود، یا از ویجت AsyncImage برای بارگذاری تصویر از از URL مورد نظر استفاده کنید. در این مثال، از کلاس Image برای نمایش یک تصویر استفاده می‌کنیم.

1from kivy.app import App
2from kivy.uix.image import Image
3
4class MainApp(App):
5    def build(self):
6        img = Image(source='/path/to/Faradars.png',
7                    size_hint=(1, .5),
8                    pos_hint={'center_x':.5, 'center_y':.5})
9
10        return img
11
12if __name__ == '__main__':
13    app = MainApp()
14    app.run()

در این مثال ویجت تصویر از بسته فرعی kivy.uix.image  وارد شده است. کلاس Image پارامترهای مختلفی را به‌ عنوان ورودی دریافت می‌کند اما گاهی تنها نیاز است که پارامتر Source را مقدار دهی کنیم. این پارامتر Kivy می‌گوید که کدام تصویر بارگذاری بشود که در اینجا یک مسیر کاملا مشخص به‌ عنوان آدرس تصویر داده شده است. در ادامه خروجی کد را به صورت زیر مشاهده می‌کنیم.

نمایش خروجی کد با استفاده از ویجت تصویر

چیدمان‌ها

در قسمت قبلی یادگرفتیم که ویجت در کتابخانه Kivy چیست در ادامه با مفهومی به نام «چیدمان»(Layout) آشنا می‌شویم. فریمورک Kivy مجموعه‌ای از کلاس‌های چیدمان را نیز فراهم می‌کند که به شما امکان می‌دهد که ویجت‌ها را به صورت کاربردی و منسجم ترتیب دهید. به طور کلی، هر فریمورک رابط کاربری، روش خاص خود را برای مرتب‌سازی ویجت‌ها دارد. برای مثال، فریم‌ورک wxPython از کتابخانه Sizers و یا فریم‌ورک Tkinter از مفهومی به نام «مدیریت هندسی| چیدمان» (geometry management) استفاده می‌کند. در فریم‌ورک Kivi نیز به منظور مرتب‌سازی و سازماندهی ویجت‌ها، از کلاس‌های «چیدمان» (Layout) استفاده می‌شود. در ادامه چند نمونه‌ از چیدمان‌های رایج را بیان می‌کنیم.

  • BoxLayout: این عنصر از چیدمان، ویجت‌ها را متوالی و به صورت عمودی یا افقی مرتب می‌کند.
  • FloatLayout: این چیدمان امکان تنظیم موقعیت و اندازه ویجت‌ها را فراهم می‌کند.
  • RelativeLayout: این نوع ویژگی، ویجت‌ها را بر اساس موقعیت‌های نسبی مرتب می‌کند.
  • GridLayout: این چیدمان، ویجت‌ها را در «شبکه‌» (Grid) تشکیل شده از سطر‌ها و ستون‌ها مرتب می‌کند.
  • PageLayout: چیدمانی است که به کمک آن می‌توان چندین صفحه را نمایش داد و بین آ‌ن‌ها جا‌به‌جا شد.
  • ScatterLayout: این ویژگی‌ امکانی را ایجاد می‌کند که کاربر هر ویجتی که تحت کنترل این کلاس می‌باشد را بچرخاند، «بکشد» (Drag)، و مقیاس‌بندی کند.
  • StackLayout: چیدمانی است که این قابلیت را ایجاد می‌کند که ویجت‌ها به صورتی افقی و عموی در صفحه قرار بگیرند.

برای کسب اطلاعات بیشتر از تعاریف و نمونه کد‌های ویجت‌ها و چیدمان‌ها می‌توانید به وبسایت اصلی مستندات فریم‌ورک Kivy «+»مراجعه کنید.

چند مثال عملی از کار با ویجت و چیدمان

در این مثال یکی از کلاس‌های معمول «چیدمان» (Layout) با نام GridLayout را به کار می‌بریم. همانطور که پیش‌تر هم اشاره شد با استفاده از این کلاس می‌توان شبکه‌ای از ردیف‌ها و ستون‌ها ایجاد کرد. به بیانی دیگر این چیدمان، فضای موجود را گرفته و آن را به ستون‌ها و سطرها تقسیم می‌کند، سپس ویجت‌ها را به سلول‌های حاصل شده اضافه می‌کند. به مثالی که در ادامه آورده ایم توجه کنید.

1from kivy.app import App
2from kivy.uix.button import Button
3from kivy.uix.gridlayout import GridLayout
4
5ROWS = COLS = 3
6
7class GridApp(App):
8    def build(self):
9        root = GridLayout(rows=ROWS, cols=COLS)
10        for i in range(ROWS):
11            for j in range(COLS):
12                root.add_widget(Button(text=f"({i}, {j})"))
13        return root
14
15GridApp().run()

همانطور که مشاهده می‌کنید در مِتُد Build()‎  ، نمونه‌ای از کلاس GridLayout با سه سطر و سه ستون ساخته شده است. سپس برای اضافه کردن ویجت Button در حلقه For، متد add_widget  استفاده شده است. خروجی این کد به صورت زیر نمایش داده می‌شود.

مشاهده می‌کنید که هر Button در «شبکه» (Grid) مختصات مربوط به خود را نشان می‌دهد که مولفه اول و دوم به ترتیب سطر و ستون را بیان می‌کنند. در مثالی دیگر، کلاس BoxLayout به منظور قرار دادن المان‌های گرافیکی به صورت افقی به‌کار رفته است.

1import kivy
2import random
3
4from kivy.app import App
5from kivy.uix.button import Button
6from kivy.uix.boxlayout import BoxLayout
7
8red = [1,0,0,1]
9green = [0,1,0,1]
10blue =  [0,0,1,1]
11purple = [1,0,1,1]
12
13class HBoxLayoutExample(App):
14    def build(self):
15        layout = BoxLayout(padding=10)
16        colors = [red, green, blue, purple]
17
18        for i in range(5):
19            btn = Button(text="Button #%s" % (i+1),
20                         background_color=random.choice(colors)
21                         )
22
23            layout.add_widget(btn)
24        return layout
25
26if __name__ == "__main__":
27    app = HBoxLayoutExample()
28    app.run()

در مثال آورده شده ابتدا BoxLayout از زیر بسته kivy.uix.boxlayout  وارد و نمونه‌ای از آن ایجاد می‌شود. سپس مجموعه‌ای از رنگ‌ها در نظر گرفته می‌شود که در ادامه در هر بار از اجرای حلقه نمونه‌ای از کلاس Button با در نظر گرفتن رنگی تصادفی ایجاد می‌شود. به این ترتیب، ویجت Button با استفاده از کد layout.add_widget(btn) به چیدمان‌ها اضافه می‌شود و در نهایت خروجی کد به صورت زیر نشان داده می‌شود.

تصویر خروجی کد با استفاده از چیدمان

در فریمورک‌های گرافیکی «آرگومان‌های چیدمان» (Layout Arguments) به پارامترهایی اشاره دارد که به منظور تعیین نحوه نمایش و قرارگیری ویجت‌ها یا عناصر گرافیکی مقدار دهی می‌شوند. به بیان دیگر این آرگومان‌ها تعیین می‌کنند که ویجت‌ها چگونه نسبت به یکدیگر قرار بگیرند. برخی از آرگومان‌های چیدمان که بهتر است با آن‌ها آشنا باشیم را در ادامه آورده‌ایم.

  • «پدینگ» (Padding): ما می‌توانیم پدینگ بین چیدمان و فرزندانش را به پیکسل و به یکی از سه روش زیر مشخص کنیم. به این معنا که پدینگ به ما امکان می‌دهد تا مقدار فاصله را بین یک چیدمان- برای مثال در اینجا BoxLayout - و ویجت‌های داخلی آن را در واحد پیکسل تعیین کنیم. این فاصله می‌تواند به سه روش مختلف تنظیم شود که در ادامه فهرست کرده‌ایم.
    • «لیست با ۴ آرگومان ورودی» (four-argument list): [padding_left, padding_top, padding_right, padding_bottom]
    • «لیست با ۲ آرگمان ورودی» (two-argument list): [padding_horizontal, padding_vertical]
    • «۱ آرگومان ورودی» (singular argument): padding=10
  • «فاصله‌گذاری» (Spacing): با این آرگومان می‌توان بین ویجت‌های فرزند فاصله‌گذاری کرد.
  • «جهت‌گیری» (Orientation): با استفاده از این آرگومان جهت‌گیری پیش‌فرض را می‌توان از حالت افقی به عمودی تغییر داد.

افزودن Events ها

مانند اکثر ابزارهای رابط کاربری، فریم‌ورک Kivy نیز مبتنی بر «رویداد» (Events) است. این بدان معناست که برنامه‌های کاربردی Kivy به رویدادهای کاربر از جمله، کلید فشرده شده، رویداد ماس و لمس‌ پاسخ می‌دهند. همچنین یکی از مفاهیم مهم فریم‌ورک Kivy «ساعت» (Clock) است که با استفاده از آن می‌توان فراخوانی‌های توابع را برای زمانی در آینده زمان‌بندی کرد. فریم‌ورک Kivy نیز دارای مفهومی به نام «ویژگی‌ها» (Properties) است که به وسیله EventDispatcher، که یک کلاس پایه در Kivy است، مدیریت می‌شوند. «ویژگی‌ها» (Properties) به شما کمک می‌کنند تا عملیات «اعتبار سنجی» (Validation) انجام دهید و این امکان را می‌دهند که هر زمان که ویجتی، اندازه یا موقعیت خود را تغییر می‌دهد، رویدادها را فعال کنید. ما در ادامه مثالی آورده‌ایم که رویداد Button را در کد، مورد استفاده قرار داده است.

1from kivy.app import App
2from kivy.uix.button import Button
3
4class MainApp(App):
5    def build(self):
6        button = Button(text='Hello from Kivy',
7                        size_hint=(.5, .5),
8                        pos_hint={'center_x': .5, 'center_y': .5})
9        button.bind(on_press=self.on_press_button)
10
11        return button
12
13    def on_press_button(self, instance):
14        print('You pressed the button!')
15
16if __name__ == '__main__':
17    app = MainApp()
18    app.run()

در این نمونه کد، در متد build()  یک «دکمه» (button) ایجاد می‌شود و مشخصات آن، مانند متن، اندازه و موقعیت، تعیین می‌شود. سپس با استفاده از متد bind()  ، رویداد on_press به متد on_press_button  ارتباط داده شده است. به بیان دیگر با فشرده شدن دکمه توسط کاربر، متد on_press_button  فراخوانی‌ می‌شود که برای مثال در این کد، نوشته مورد نظر چاپ می‌شود.

زبان طراحی Kv

حال که یادگرفتیم برخی از عناصر مهم Kivy چیست، بد نیست بدانیم که این کتابخانه زبان طراحی به نام Kv ارائه داده است که برای جداسازی بخش گرافیکی از بخش منطقی کد استفاده می‌شود. از این زبان طراحی می‌توانید برای تعیین ویژگی‌های ظاهری و المان‌های گرافیکی در برنامه‌ها بهره‌مند شوید و از یک فایل kv جداگانه برای تنظیم ویژگی‌های گرافیکی استفاده کنید. این امر از اصل «جداسازی دغدغه‌ها» (Separation of Concerns) پیروی می‌کند و جزئی از الگوی «مدل-نما-کنترل‌کننده» (Model-View-Controller) به شمار می‌آید. ما دراین قسمت، همان مثال قبلی را، اما این‌بار با با کمک زبان طراحی Kv و ایجاد فایلی جداگانه برای توصیف ویژگی‌ها بررسی می‌کنیم.

1from kivy.app import App
2from kivy.uix.button import Button
3
4class ButtonApp(App):
5    def build(self):
6        return Button()
7
8    def on_press_button(self):
9        print('You pressed the button!')
10
11if __name__ == '__main__':
12    app = ButtonApp()
13    app.run()

نحوه پیاده‌سازی این کد در ابتدا ممکن است به نظر کمی غیرعادی بیاید، زیرا بدون تعیین مشخصاتی برای «دکمه» (Button) و یا متصل کردن رویدادی به آن، دکمه را ایجاد کرده است.در واقع، این اتفاق به خاطر روش خاصی است که در آن فریم‌ورک Kivy از فایل‌های kv برای تعیین رابط‌های کاربری استفاده می‌کند. بنابراین، این امکان فراهم می‌شود که تعیین ویژگی‌ها و تنظیم رابط کاربری به صورتی جداگانه انجام شود، که کد را ساده‌تر می‌کند. Kivy به صورت خودکار به دنبال یک فایل به نام کلاس جاری - بدون بخش «App» و با کاراکترها با حروف کوچک - می‌گردد. برای مثال، در کد بالا، نام کلاس ButtonApp است، بنابراین Kivy به دنبال فایلی به نام button.kv می‌گردد. اگر این فایل وجود داشته باشد و در فرمت مناسبی باشد، Kivy از آن برای بارگذاری رابط کاربری استفاده می‌کند.

1<Button>:
2    text: 'Press me'
3    size_hint: (.5, .5)
4    pos_hint: {'center_x': .5, 'center_y': .5}
5    on_press: app.on_press_button()

در این کد ویژگی‌های ویجت Button تعریف شده است که در ادامه، توضیحات هر خط کد آورده شده است.

  • خط ۱: این خط نشان می‌دهد که ویژگی‌های مشخص شده در این فایل برای ویجت Button تعریف شده‌اند به بیان دیگر این خط با فراخوانی Button در کد پایتون شما برابری دارد.
  • خط ۲: این قسمت، متنی که بر روی «دکمه» (Button) نمایش داده می‌شود و به عبارتی برچسب یا محتوای آن است، را تعیین می‌کند.
  • خط۳: این خط با دریافت پارامترهای ورودی طول و عرض- که اعدادی اعشاری هستند- اندازه دکمه را تعیین می‌کند. توجه داشته باشید که مقدار پیش فرض برای Size_hint  همیشه (۱ , ۱) است.
  • خط۴: در این قسمت، موقعیت ویجت را تعیین می‌کنیم. در اینجا، موقعیت با دادن دو کلید ورودی به صورت یک دیکشنری مشخص شده است.
  • خط۵: در این خط یک «کنترل‌گر رویداد» (Event Handler) برای رویداد «فشار دادن دکمه» تعیین شده است. به این منظور از app.on_press_button()‎  برای نشان دادن موقعیت کنترل‌گر رویداد استفاده می‌شود بنابراین در اینجا، برنامه می‌داند که در کلاس Application باید به جستجوی این متد ‎بگردد.

به‌طور کلی، شما می‌توانید همه ویجت‌ها و «چیدمان‌ها» (Layouts) را درون یک یا چند فایل را به زبان Kv تنظیم کنید. این زبان همچنین از وارد کردن ماژول‌های پایتون درون Kv، ساختن کلاس‌های پویا و غیره پشتیبانی می‌کند. برای جزئیات بیشتر در این مورد، راهنمای زبان Kv را بررسی کنید. حال در ادامه می‌خواهیم اولین پروژه خود را با استفاده از فریم‌ورک Kivy در قالب تولید ماشین حساب از آماده‌سازی کد تا ایجاد فایل خروجی از برنامه، جهت اجرا بر روی دستگاه‌های اندرویدی، سیستم عامل ویندوز، macOS و iOS را انجام می‌دهیم.

ایجاد برنامه ماشین حساب

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

در این قسمت، کدهای مربوط به پیاده‌سازی پروژه - ماشین حساب - گفته شده را به صورت زیر آورده‌ایم و در ادامه، آن را خط به خط توضیح می‌دهیم.

1from kivy.app import App
2from kivy.uix.boxlayout import BoxLayout
3from kivy.uix.button import Button
4from kivy.uix.textinput import TextInput
5
6class MainApp(App):
7    def build(self):
8        self.operators = ["/", "*", "+", "-"]
9        self.last_was_operator = None
10        self.last_button = None
11        main_layout = BoxLayout(orientation="vertical")
12        self.solution = TextInput(
13            multiline=False, readonly=True, halign="right", font_size=55
14        )
15        main_layout.add_widget(self.solution)
16        buttons = [
17            ["7", "8", "9", "/"],
18            ["4", "5", "6", "*"],
19            ["1", "2", "3", "-"],
20            [".", "0", "C", "+"],
21        ]
22        for row in buttons:
23            h_layout = BoxLayout()
24            for label in row:
25                button = Button(
26                    text=label,
27                    pos_hint={"center_x": 0.5, "center_y": 0.5},
28                )
29                button.bind(on_press=self.on_button_press)
30                h_layout.add_widget(button)
31            main_layout.add_widget(h_layout)
32
33        equals_button = Button(
34            text="=", pos_hint={"center_x": 0.5, "center_y": 0.5}
35        )
36        equals_button.bind(on_press=self.on_solution)
37        main_layout.add_widget(equals_button)
38
39        return main_layout
  • خطوط ۸ تا ۱۱: لیستی از عملگرهای «جمع» ( +  )، «منها» ( -  )، «ضرب» ( *  ) و «تقسیم» ( /  ) تعیین شده است و ویژگی‌های self.last_was_operator  و self.last_button  تعریف اولیه می‌شوند که در ادامه برای پیگیری آخرین عملگر و دکمه فشرده شده مورد استفاده قرار می‌گیرند.
  • خطوط ۱۱ تا ۱۵: برای قرار دادن اجزای رابط کاربری یا ویجت‌ها با جهت عمودی، یک BoxLayout  با عنوان main_layout  تعریف می‌شود. همچنین برای نمایش نتایج محاسبات، یک ویجت TextInput  ایجاد می‌شود.
  • خطوط ۱۶ تا ۲۱: دکمه‌های ماشین حساب به صورت «لیست تو در تو» (Nested List) تعریف می‌شوند.
  • خط ۲۲: ابتدا، یک حلقه اصلی برای ایجاد دکمه‌ها ایجاد می‌شود. سپس، برای هر لیست تو در تو، عملیات زیر انجام می‌شود:
  • خط ۲۳: چیدمان BoxLayout  با تنظیمات افقی ایجاد می‌شود.
  • خط ۲۴: حلقه for  برای عناصر داخلی لیست تو در تو شکل می‌گیرد.
  • خط ۲۵ تا ۲۹: دکمه‌های هر ردیف ایجاد می‌شوند و هر یک توسط متد bind() به تابع on_button_press  - که برای واکنش به فشردن دکمه، فراخوانی ‌می‌شود- مرتبط می‌شود. سپس به BoxLayout  ایجاد شده در خط ۲۳، اضافه می‌شوند.
  • خط ۳۱: هر گروه دکمه یا BoxLayout  به چیدمان اصلی و یا همان main_Layout  افزوده می‌شوند.
  • خط ۳۳ تا ۳۷: دکمه مساوی ( =  ) ایجاد می‌شود، به تابع رویداد مربوطه متصل می‌شود و در نهایت به main_layout  اضافه می‌شود.

در این مرحله نیاز است که کنترل‌کننده رویداد یا همان on_button_press()  ‎را ایجاد کنیم که برای پاسخ به فشردن دکمه‌ها تعریف می‌شود. کد مربوط به این بخش، به شکل زیر است.

1def on_button_press(self, instance):
2    current = self.solution.text
3    button_text = instance.text
4
5    if button_text == "C":
6        # Clear the solution widget
7        self.solution.text = ""
8    else:
9        if current and (
10            self.last_was_operator and button_text in self.operators):
11            # Don't add two operators right after each other
12            return
13        elif current == "" and button_text in self.operators:
14            # First character cannot be an operator
15            return
16        else:
17            new_text = current + button_text
18            self.solution.text = new_text
19    self.last_button = button_text
20    self.last_was_operator = self.last_button in self.operators

بیشتر ویجت‌های موجود در این برنامه با تابع on_button_press()  ‎فراخوانی می‌شوند.

  • خط ۴۱: برای دسترسی به ویجت مربوطه، آرگومان ورودی Instance  داده می‌شود.
  • خطوط ۴۲ و ۴۳: متن فعلی از ویجت Solution  و متن متناظر با دکمه فشرده شده button دریافت می‌شود.
  • خط ۴۵ تا ۴۷: بررسی می‌شود که کدام دکمه فشرده شده است. اگر کاربر دکمه C را فشرده باشد مقادیر ویجت Solution که به منظور نمایش نتایج محاسبات به کار می‌رود پاک می‌شود.
  • خط ۴۹: بررسی می‌شود که Solution مقداری پیش‌فرض دارد یا خیر.
  • خطوط ۵۰ تا ۵۲: بررسی می‌شود که آیا آخرین دکمه فشرده شده یک عملگر است یا خیر. اگر عملگر باشد، مقدار Solution به‌روزرسانی نمی‌شود تا از وجود دو عملگر متوالی جلوگیری شود. به‌عنوان مثال، عبارت ( ۱ * /  ) معتبر نیست زیرا دو عملگر متوالی دارد.
  • خطوط ۵۳ تا ۵۵: بررسی می‌شود که آیا اولین کاراکتر عبارت یک عملگر است. اگر اینطور باشد، مقدار حاصل به‌روزرسانی نمی‌شود زیرا مقدار اولیه نمی‌تواند یک عملگر باشد.
  • خطوط ۵۶ تا ۵۸: بنابراین، اگر هیچ‌یک از شرایط قبلی برقرار نباشند، به بخش else  منتقل می‌شویم و مقدار حاصل به‌روزرسانی می‌شود.
  • خط ۵۹: مقدار last_button  به برچسب آخرین دکمه فشرده شده تنظیم می‌شود.
  • خط ۶۰: مقدار last_was_operator  را بر اساس اینکه آیا یک عملگر بوده است یا خیر، به True یا False تنظیم می‌کند.

قسمت پایانی کد شامل تابع on_solution()‎  است که در بخش زیر آورده‌ایم.

1def on_solution(self, instance):
2    text = self.solution.text
3    if text:
4        solution = str(eval(self.solution.text))
5        self.solution.text = solution

در این کد تابعی به نام on_solution()  تعریف شده است که به‌ عنوان یک کنترل‌کننده رویداد برای محاسبات عملیات تعریف شده از سمت کاربر می‌باشد. همانطور که ملاحظه می‌کنید متن فعلی را از ویجت Solution دریافت و از «تابع داخلی» ( built-in) پایتون به نام eval()  ‎برای اجرای محاسبات استفاده می‌کند. برای مثال اگر کاربر فرمول ۱+۲  را به‌ عنوان ورودی وارد کرده باشد آنگاه تابع eval()‎  نتیجه را محاسبه می‌کند و در نهایت این نتیجه به‌ عنوان مقدار جدید برای ویجت solution ثبت ‌می‌شود. در اینجا نیاز می‌دانیم که به این نکته توجه داشته باشید که استفاده از تابع eval()‎  در برنامه نویسی تا حدی می‌تواند خطرساز باشد زیرا این تابع توانایی آن را دارد که هر کد دلخواه ورودی را محاسبه و اجرا کند و موجب نقض امنیتی در سیستم شود. به همین دلیل بسیاری از برنامه‌نویسان از این تابع تا حد ممکن استفاده نمی‌کنند. با این حال می‌توان با محدود کردن کاربر در وارد کردن عملیات مورد نظر این خطرات را تا حد ممکن کاهش داد. برای مثال ،در این برنامه تنها اعداد صحیح و نقطه و ۴ عمل اصلی به‌ عنوان ورودی مجاز برای کاربران تعریف شده است.

در نهایت خروجی برنامه را به صورت زیر می‌توانیم مشاهده کنیم.

تصویر خروجی پروژه ماشین حساب
برای

آماده‌سازی برنامه برای نصب

حال که کد برنامه تکمیل شده است نوبت می‌رسد که بدانیم فرایند آماده سازی جهت نصب برنامه‌های مبتنی بر Kivy چیست. بنابراین در این بخش مراحل «فرایند آماده‌سازی جهت نصب» (Application Deployment) فرامی‌گیریم تا برنامه تولید شده قابل استفاده و اشتراک‌گذاری برای کاربران مختلف باشد. به همین منظور ما در این بخش از مجله فرادرس آموزش می‌دهیم که چگونه کد خود را به یک برنامه کاربردی تبدیل کنید که قابل اجرا بر روی سیستم‌عامل‌های مختلف نظیر اندروید، ویندوز، iOS و macOS باشد.

آماده‌سازی برنامه برای نصب در اندروید

برای انجام این فرایند، ابتدا نیاز به نصب بسته buildozer دارید، برای این منظور محیط ترمینال در سیستم‌عامل خود را را باز و با استفاده از دستور Pip  بسته را نصب کنید.

$ pip install buildozer
سپس، پوشه‌ای جدید ایجاد و در ترمینال به آدرس آن مراجعه و دستور زیر را وارد کنید.

$ buildozer init
این دستور باعث می‌شود که در آدرس مورد نظر فایلی با نام buildozer.spec ساخته شود که شما از آن برای «پیکربندی» (Configuration) ساخت برنامه استفاده خواهید کرد. به عبارتی دیگر، این فایل مشخصات برنامه و تنظیمات آن مانند عنوان، آیکون، ماژول‌ها و غیره را توصیف می‌کند. برای این مثال، شما می‌توانید چند خط اول فایل spec را مانند نام برنامه، بسته و دامنه بسته را متناسب با برنامه خود، ویرایش کنید.
1[app]
2
3# (str) Title of your application
4title = KvCalc
5
6# (str) Package name
7package.name = kvcalc
8
9# (str) Package domain (needed for android/ios packaging)
10package.domain = org.kvcalc

در این مرحله، تقریبا برنامه آماده ساخت است اما قبل آن بهتر است اطمینان حاصل کنید که «وابستگی‌های» (Dependencies) ابزار buildozer را به‌طور کامل نصب کرده‌اید. بعد از نصب این وابستگی‌ها، برنامه‌ی ماشین حساب خود را به پوشه جدید کپی کنید و نام آن را به main.py تغییر دهید. توجه داشته باشید که اگر این نام‌گذاری را به درستی انجام ندهید عملیات ساخت برنامه با مشکل مواجه می‌شود. حال کافی است در ادامه دستور زیر را به منظور ساخت «بسته برنامه اندرویدی» (APK | Android application package) وارد کنید.

1$ buildozer -v android debug

مرحله «ساخت» (Build) برنامه کمی زمان‌بر است و ممکن است ۱۵ تا ۲۰ دقیقه طول بکشد که البته بسته به قابلیت‌های سخت افزاری سیستم شما، این زمان ممکن است کمی بیشتر یا کمتر باشد. در حین فرایند ساخت، ابزار Buildozer، بخش‌های مورد نیاز از «کیت توسعه نرم افزار» (Software Development Kit | SDK) اندروید را دانلود می‌کند. اگر عملیات ساخت برنامه با موفقیت به پایان برسد در ادامه شما فایلی با نام "kvcalc-0.1-debug.apk" در پوشه "bin" خود خواهید داشت. مراحل بعدی ساده است و تنها کافی است که گوشی اندروید خود را به رایانه متصل و فایل apk را به گوشی منتقل کنید و مراحل نصب و اجرای آن را در گوشی خود انجام دهید. تصویر زیر برنامه ماشین حساب اجرا شده در دستگاه Samsung S9 نمایش می‌دهد.

تصویر خروجی برنامه ماشین حساب در گوشی سامسونگ

 

آماده‌سازی برنامه برای نصب در iOS

مراحل ساخت برنامه مناسب برای سیستم‌عامل iOS در مقایسه با مرحله قبل کمی پیچیده‌تر است. در ادامه نیاز است دستورات زیر را مرحله به مرحله در سیستم‌عامل macOS خود اجرا کنید.

1$ brew install autoconf automake libtool pkg-config
2$ brew link libtool
3$ sudo easy_install pip
4$ sudo pip install Cython==0.29.10

پس از نصب موفق تمامی این ابزارها، شما نیاز خواهید داشت که توزیع برنامه را با استفاده از دستورات زیر «کامپایل» (Compile) کنید. به عبارتی دیگر در این قسمت، مراحل تهیه و آماده‌سازی برنامه انجام می‌شود.

1$ git clone git://github.com/kivy/kivy-ios
2$ cd kivy-ios
3$ ./toolchain.py build python3 kivy

اگر بعد از وارد کردن دستورات بالا، به خطای «iphonesimulator can’t be found» برخورد کردید، می توانید برای پیدا کردن را‌ه‌حل به وبسایت StackOverFlow «+» مراجعه کنید و دوباره مسیر طی شده را امتحان کنید. درصورتی که پس از اجرای مراحل بالا به خطای SSL برخورد کردید، احتمالا در سیستم شما مشکلی در نصب یا تنظیمات OpenSSL برای Python وجود دارد که دستور زیر می‌تواند مشکل را رفع کند.

1$ cd /Applications/Python\ 3.7/
2$ ./Install\ Certificates.command

بعد از اجرای دستور بالا دوباره دستور toolchain  را وارد کنید و این‌بار احتمالا خطا برطرف شده است. بنابراین، در صورت انجام موفقیت‌آمیز مراحل قبلی، می توانید پروژه Xcode را به منظور ساخت و اجرای برنامه بسازید. مرحله اصلی شروع ورود به برنامه اصلی باید main.py نام داشته باشد - به بیان دیگر اجرای برنامه از اینجا شروع می‌شود - حال، پیش از ایجاد پروژه Xcode دستور زیر را اجرا کنید.

1./toolchain.py create <title> <app_directory>

در این مرحله باید فایل‌های پروژه Xcode شما در پوشه‌ای به نام «title» قرار داشته باشند. حال می‌توانیم این پروژه را در محیط Xcode باز کرده و از آنجا به کار خود ادامه دهیم. همچنین توجه داشته باشید که اگر قصد دارید برنامه‌ی خود را در App Store منتشر کنید، باید «حساب توسعه‌دهنده» (Developer Account) در developer.apple.com «+» ایجاد کنید و هزینهٔ سالانه‌ای را که اپل مشخص کرده، پرداخت کنید. این اشتراک سالانه به شما امکان می‌دهد تا برنامه‌های خود را برای دستگاه‌های iOS و macOS منتشر کنید و از خدمات توسعه‌دهندگان اپل بهره‌مند شوید.

آماده‌سازی برنامه برای نصب در ویندوز

برای آماده‌سازی برنامه در محیط ویندوز می‌توانید از ابزار PyInstaller استفاده کنید. بنابراین، ابتدا این ابزار را با استفاده از دستور pip  و به صورت زیر نصب کنید.

1$ pip install pyinstaller

دستور زیر برنامه شما را «بسته‌بندی» (Package) می‌کند.

1$ pyinstaller main.py -w

دستور بالا فایل اجرایی ویندوز به‌همراه چندین فایل دیگر را ایجاد می‌کند. همچنین آرگومان -w  به PyInstaller می‌گوید که این «برنامه‌ خط فرمانی» (command-line application) نیست، بلکه «برنامه‌ای با رابط گرافیکی» (windows application) است. لازم به ذکر است در صورتی که علاقه‌مندید PyInstaller فقط یک فایل اجرایی تکی ایجاد کند، می‌توانید در کنار -w ، آرگومان --onefile  را نیز اضافه کنید.

آماده‌سازی برنامه برای نصب در macOS

شما می‌توانید از همان دستور PyInstaller به همان شکلی که برای ویندوز انجام دادید برای ایجاد «فایل اجرایی Mac» (Mac executable به انگلیسی ) استفاده کنید و تنها کافی است که این دستور را روی سیستم Mac اجرا کنید.

1$ pyinstaller main.py -w --onefile

این دستور یک فایل اجرایی تکی در پوشه dist ایجاد می‌کند که نام این فایل اجرایی همان نام فایل پایتونی خواهد بود که به PyInstaller منتقل کرده‌ایم. لازم به ذکر است که اگر می‌خواهید اندازه فایل اجرایی را کاهش دهید یا از GStreamer  در برنامه خود استفاده می‌کنید، به صفحه بسته‌بندی Kivy برای macOS «+» برای اطلاعات بیشتر مراجعه کنید.

معماری Kivy چیست؟

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

معماری Kivy به طور کلی در دو سطح تفکیک می‌شود.
  • «سطح بالا» (High Level): این بخش شامل ابزارها و امکاناتی است که برای توسعه‌دهندگان GUI در دسترس هستند مانند ویجت‌ها، زبان Kv و سایر امکانات سطح بالا که برای برنامه‌نویس قابل رؤیت است.
  • «سطح پایین» (Low Level): در مقابل، این قسمت شامل ابزارهایی است که نشان می‌دهد زیرساخت Kivy چیست و چه مواردی را شامل می‌شود، مانند ارائه دهندگان هسته، ارائه دهندگان ورودی و رابط گرافیکی که در ادامه بیشتر مورد بررسی قرار می‌دهیم.

اجزای معماری فریمورک Kivy به شرح زیر می‌باشد.

  • «ارائه دهندگان هسته و ارائه دهندگان ورودی» (Input providers and Core Providers): ابتدا می‌خواهیم بدانیم مفهوم «انتزاع» (Abstarction)در معماری Kivy چیست، پس بد نیست بدانید که از مفاهیم اصلی فریم‌ورک Kivy به شمار می‌آید و به معنای پنهان کردن جزئیات فنی و ارائه یک نمای ساده‌تر از آن است. مفهوم انتزاع به توسعه‌دهندگان امکان می‌دهد که با ویژگی‌های سطح بالا بدون نیاز به درک جزئیات سطح پایین سیستم کار کنند. در بخش «ارائه دهندگان هسته» (Core-provider)، فریمورک Kivy وظایف اصلی مانند باز کردن پنجره، نمایش تصاویر و متن، پخش صدا، دریافت تصاویر از دوربین، اصلاح املایی و موارد مشابه را به صورت انتزاعی فراهم می‌کند. این به برنامه‌نویسان اجازه می‌دهد تا به سرعت و با آسانی برنامه‌های خود را توسعه دهند، زیرا نیازی به درک دقیقی از جزئیات فنی و عملکرد داخلی این وظایف ندارند. سیستم‌عامل‌هایی نظیر ویندوز، لینوکس و غیره از رابط‌های برنامه‌نویسی نرم‌افزاری مختلفی برای انجام وظایف اصلی استفاده می‌کنند. ارائه‌دهنده هسته به قطعه کدی اطلاق می‌شود که از API خاص سیستم‌عامل‌هایی مانند macOS و Linux BSD Unix و Windows استفاده می‌کند تا به‌ عنوان یک لایه میانی ارتباطی بین فریم‌ورک Kivy و سیستم عامل عمل کند. این ماژول مسئول اجرای وظایف اصلی مرتبط با سیستم بر اساس API خاص سیستم عامل می‌باشد و اطلاعات را بین Kivy و سیستم عامل منتقل می‌کند. با مفهومی مشابه، «ارائه‌دهنده ورودی» (Input Providers)، قطعه کدی است که از یک دستگاه ورودی خاص مثل ترک پد اپل و شبیه ساز موس پشتیبانی می‌کند و اگر نیاز به اضافه کردن پشتیبانی برای دستگاه ورودی جدید باشد می‌توان به سادگی کلاسی جدید ایجاد کرد که داده‌ها را از دستگاه مورد نظر بخواند و آن‌ها را به «رویدادهای پایه‌ای» (Basic Events) این فریمورک تبدیل کند.
  • «گرافیک» (Graphics): «رابط گرافیکی» (Graphics API) فریم‌ورک Kivy، انتزاعی از OpenGL است. به عبارتی دیگر این فریم‌ورک سطح انتزاعی فراهم کرده‌است که به برنامه‌نویسان امکان می‌دهد که بدون استفاده مستقیم از کدهای پیچیده OpenGL، با استفاده از ابزارها و امکانات ارائه شده در Kivy، اشکال هندسی مختلف را ایجاد کنند. از مزایای استفاده از این رابط گرافیکی، قابلیت بهینه‌سازی خودکار دستورات ترسیمی است که به بهبود عملکرد برنامه‌ها کمک می‌کند.
  • «هسته» (Core): هسته فریمورک Kivy ویژگی‌هایی را فراهم می‌کند که موارد زیر را شامل می‌شوند.
      • «ساعت» (Clock): از این ویژگی برای برنامه‌ریزی رویدادهای تایمر استفاده می‌شود. به بیانی دیگر، توسعه‌دهندگان می‌توانند به راحتی عملیات‌های مربوط به زمان را مدیریت کنند و تصمیم بگیرند که کدام بخش‌ها به صورت دوره‌ای و کدام یک‌باره و در زمان خاصی اجرا شوند.
      • «حافظه نهان» (Cache): اگر داده‌ای به طور مکرر مورد استفاده قرار می‌گیرد، می‌توان به راحتی با هدف مدیریت زمان - و بدون اینکه برنامه‌نویس بخش‌های زیادی از کد را برای این منظور بنویسد.- از کلاس Cache ارائه شده در چارچوب Kivy استفاده کرد.
      • «تشخیص ژست» (Gesture Detection): ماژول تشخیص ژست، حرکات کاربر را بر روی دستگاه ورودی تجزیه و تحلیل می‌کند تا الگوهای خاصی را تشخیص دهد. این الگوها - مانند دایره و مستطیل- می‌توانند برای کنترل دستگاه یا انجام یک عمل خاص استفاده شوند.
      • زبان Kivy: زبان طراحی Kivy برای توصیف آسان و کارآمد رابط‌های گرافیکی طراحی شده است.
  • «ویژگی‌ها» (Properties): ویژگی‌ها در Kivy، کلاس‌هایی هستند که برای ارتباط بین کد ویجت و ساختار عناصر گرافیکی رابط کاربری تعریف شده توسط توسعه‌گر، استفاده می‌شوند و با ویژگی‌های معمول پایتون متفاوت‌اند.
  • UIX: ماژول UIX، مجموعه‌ای از ویجت‌ها و چیدمان‌ها را برای ایجاد سریع و آسان رابط‌های کاربری در این چارچوب فراهم می‌کند.
  • «ماژول‌ها» (Modules): کلاس‌های «ماژول‌» (Module) در Kivy، مانند افزونه‌ها در مرورگرهای وب، قابلیت‌های جدیدی را به برنامه‌ها اضافه می‌کنند.
  • «وقایع ورودی» (Input Events): در فریمورک Kivy، انواع مختلفی از منابع ورودی مانند لمس، ماوس، TUIO و غیره با استفاده از مفهوم انتزاع مدیریت می‌شوند. وقایع ورودی در این فریمورک توسط نمونه‌های کلاس Touch تعریف می‌شوند که در یکی از سه حالت «بالا»، «پایین» و «در حرکت» واقع می‌شوند.
  • «ویجت‌ها و توزیع ورودی» (Widgets and Event Dispatching): در قسمت‌های قبلی آموختیم که ویجت در kivy چیست، باز هم اشاره می‌کنیم که ویجت عناصر اساسی برای توصیف بخشی از برنامه هستند که «رویداد‌های ورودی» (Input Events) را از کاربر دریافت می‌کند. به‌ عنوان مثال، اگر کاربر روی یک دکمه ضربه بزند، شناسایی می‌شود که یک رویداد لمس روی ویجت دکمه اتفاق افتاده و پاسخ مناسب را فعال می‌شود. حال، بد نیست بدانیم که ویجت‌ها دارای ساختار درختی هستند و یک ویجت ممکن است حاوی صفر یا تعدادی فرزند باشد. بنابراین، در درخت ویجت تنها یک ویجت اصلی و یا «ریشه» (Root) وجود دارد که والدی برای آن تعریف نشده است و سایر ویجت‌ها به صورت مستقیم و یا غیر مستقیم فرزند این ریشه محسوب می‌شوند.زمانی‌که رویداد جدیدی برای مثال، «لمس» (Touch) صورت می‌گیرد، به ازای هر لمس یک رویداد ارسال می‌شود که ابتدا توسط ویجت اصلی یا ریشه درخت ویجت دریافت می‌شود. سپس، با توجه به نوع ویجت این رویداد به ویجت مربوط به خود هدایت می‌شود - که به این عملیات «توزیع ورودی» (Event Dispatching) می‌گوییم- تا به درستی به رویداد مورد نظر پاسخ دهد. به طور کلی، درخت ویجت نشان‌دهنده ساختار سلسله‌مراتبی این عناصر گرافیکی‌ است و وقایع ورودی توسط این درخت به درستی توزیع و پردازش می‌شوند.

در این بخش آموختیم که فریمورک Kivy چیست، به طور خلاصه می‌توانیم بگوییم که این معماری در دو سطح تفکیک می‌شود: سطح بالا و سطح پایین. سطح بالا شامل ابزارها و امکاناتی است که برای توسعه‌دهندگان GUI در دسترس هستند مانند ویجت‌ها، زبان Kivy و سایر امکانات سطح بالا که برای برنامه‌نویس قابل رؤیت است. در مقابل، سطح پایین شامل ابزارهایی است که زیرساخت Kivy را تشکیل می‌دهند، مانند ارائه دهندگان هسته، ارائه دهندگان ورودی و رابط گرافیکی که در پیش‌تر مورد بررسی قرار دادیم.

سوالات رایج

تا اینجا، فریمورک Kivy را معرفی کرده‌ایم و پیاده‌سازی یک نمونه پروژه با این کتابخانه را آموزش داده‌ایم. در ادامه، به این موضوع پرداختیم که معماری Kivy چیست و اجزای اصلی آن را توضیح دادیم. در ادامه، سوالات متداولی را پیرامون فریمورک Kivy بیان می‌کنیم.

بهترین زمان استفاده از فریم‌ ورک Kivy چیست؟

در صورتی‌که توسعه‌گر پایتون هستید و به دنبال توسعه‌ برنامه‌های کاربردی موبایل هستید، فریمورک Kivy بهترین گزینه برای شما است. در اینصورت کافی است یاد بگیرید که فریمورک Kivy چیست و نحوه کار با آن را بیاموزید، سپس برنامه‌هایی بنویسید که «مستقل از پلتفرم» (Platform-Independent) هستند و بر روی سیستم‌عامل‌هایی نظیر iOS، اندروید، ویندوز، macOS، و لینوکس اجرا می‌شوند.

آیا با استفاده از Kivy می‌توان بازی تولید کرد؟

Kivy فریمورک رایگان و اوپن سورس پایتون برای توسعه برنامه‌ها و بازی‌های تلفن همراه به شمار می‌آید که تا‌کنون برای ساخت بازی‌های جذابی مانند AirHawking و Game of Thrones CORRAL مورد استفاده قرار گرفته‌است.

جمع‌بندی

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

به طور خلاصه، فریمورک Kivy به توسعه‌دهندگان کمک می‌کند تا رابط‌های کاربری گرافیکی (GUI) جذاب و کاربردی برای محیط‌های دسکتاپ و تلفن همراه بر روی سیستم‌عامل‌های مختلفی، از جمله اندروید، ویندوز، iOS و غیره ایجاد کنند. همچنین، این کتابخانه امکان ایجاد و مدیریت رابط‌های کاربری پیچیده را با استفاده از الگوهای برنامه‌نویسی شیءگرا به توسعه‌دهندگان می‌دهد. آن‌چه در این مطلب آموختید بخشی از قابلیت‌های کلی فریمورک Kivy می‌باشد و این آموزش می‌تواند نقطه شروع خوبی باشد تا با مطالعه بیشتر، از امکانات بیشتری از این فریمورک بهره‌مند شوید.

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Real Pythonkivy.orgmediumPython GUIS
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *