از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython
سرفصلهای مطلب
معرفی
در این آموزش قصد داریم روش استفاده را یاد بگیریم wxPython کتابخانه ای برای توسعه رابط های گرافیکی کاربر (GUI) برای برنامه های دسکتاپ در پایتون. رابط کاربری گرافیکی بخشی از برنامه شما است که به کاربر اجازه می دهد بدون نیاز به تایپ دستورات با برنامه شما تعامل داشته باشد، آنها می توانند تقریباً همه کارها را با یک کلیک ماوس انجام دهند.
برخی از جایگزین های محبوب پایتون برای توسعه رابط کاربری گرافیکی عبارتند از Tkinter، و pyqt. با این حال در این آموزش با wxPython آشنا می شویم.
قبل از اینکه جلوتر برویم، چند پیش نیاز برای این آموزش وجود دارد. شما باید درک اولیه ای از سینتکس پایتون داشته باشید و/یا حداقل برنامه نویسی سطح مبتدی را به زبان دیگری انجام داده باشید. اگرچه می توانید آن را دنبال کنید، حتی اگر این معیارها را نداشته باشید، ممکن است برخی از قسمت ها کمی پیچیده باشند. اگر این کار را می کنید، در کامنت ها برای توضیح بیشتر بخواهید.
نصب و راه اندازی
نصب process برای wxPython نسبتاً ساده است، اگرچه بسته به آن کمی متفاوت است روی سیستمی که استفاده می کنید
مک و ویندوز
نصب WxPython بسیار آسان است روی استفاده از مک و ویندوز pip مدیر بسته اگر تو داری pip در سیستم شما نصب شده است، دستور زیر را برای دانلود اجرا کنید تا wxPython نصب شود:
$ pip install wxpython
لینوکس
برای لینوکس، این روش می تواند کمی دردسرساز باشد، زیرا کتابخانه های پیش نیاز زیادی دارد که باید نصب شوند. توصیه می کنم دو دستور زیر را به صورت متوالی اجرا کنید:
# Command 1
$ sudo apt-get install dpkg-dev build-essential python2.7-dev python3.5-dev python3.6-dev libgstreamer-plugins-base1.0-dev libnotify-dev libwebkitgtk-3.0-dev libwebkit-dev libwebkitgtk-dev libjpeg-dev libtiff-dev libgtk2.0-dev libsdl1.2-dev libgstreamer-plugins-base0.10-dev freeglut3 freeglut3-dev
# Command 2
$ pip install --upgrade --pre -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython
با این حال، اگر اینها کار نمی کنند، باید این کتابخانه ها را به صورت دستی نصب کنید، لیستی از آنها در بخش “پیش نیازها” wxPython ذکر شده است. مخزن GitHub.
نمونه هایی از ایجاد رابط کاربری گرافیکی با wxPython
در این قسمت دستمان را کثیف می کنیم wxPython
و یک برنامه دستکاری رشته های پایه با برخی از قابلیت های اساسی مانند شمارش تعداد کلمات، نمایش فراوانی هر کلمه، بیشترین کلمات تکرار شده و غیره ایجاد کنید.
قبل از حرکت به جلو، ما یک برنامه اسکلت بسیار ساده ایجاد خواهیم کرد که از آن به عنوان نقطه شروع در نمونه های آینده برای پیاده سازی عملکردهای پیشرفته تر رابط کاربری گرافیکی استفاده خواهیم کرد.
بدون مقدمه، بیایید شروع کنیم. در زیر اسکلت یا ساختار اصلی یک برنامه رابط کاربری گرافیکی که با استفاده از wxPython ساخته شده است را مشاهده می کنید. در بخش بعدی آن را بیشتر تغییر خواهیم داد تا برای عملکردهای اضافی شی گرا شود.
import wx
myapp = wx.App()
init_frame = wx.Frame(parent=None, title='Word Play')
init_frame.Show()
myapp.MainLoop()
اگر حلقه اجرا نشود (یعنی app.MainLoop()
تماس بگیرید)، سپس قاب ظاهر می شود روی صفحه نمایش برای یک ثانیه، و حتی قبل از اینکه بتوانید آن را ببینید، ناپدید می شود. این عملکرد تضمین می کند که قاب قابل مشاهده است روی صفحه، تا زمانی که کاربر از برنامه خارج شود، و این کار را با اجرای فریم در یک حلقه انجام می دهد.
توجه داشته باشید: در حین اجرای این روی یک مک، وقتی کدم را با استفاده از آن اجرا کردم با خطای زیر مواجه شدم python filename.py
فرمان در terminal:
This program needs access to the screen. Please run with a Framework build of python, and only when you are logged in روی the main display of your Mac.
برای خلاص شدن از شر این، به سادگی استفاده کنید pythonw
بجای python
در دستور بالا
پس از اجرای برنامه، باید پنجره خالی زیر را مشاهده کنید روی صفحه نمایش شما:
کد شی گرا
قبل از اینکه عملکردی را به کد خود اضافه کنیم، ابتدا با ساخت کلاس ها و توابع آن را مدولار کنیم تا تمیزتر به نظر برسد و گسترش آن آسان تر باشد. عملکرد کد زیر مانند قبل است، با این حال، برای پیاده سازی مفاهیم برنامه نویسی شی گرا بازسازی شده است.
import wx
import operator
class WordPlay(wx.Frame):
def __init__(self, parent, title):
super(WordPlay, self).__init__(parent, title=title)
self.Show()
def main():
myapp = wx.App()
WordPlay(None, title='Word Play')
myapp.MainLoop()
main()
در اسکریپت بالا یک کلاس ایجاد می کنیم WordPlay
که به ارث می برد wxFrame
کلاس سازنده از WordPlay
کلاس دو پارامتر را می پذیرد: parent
و title
. در داخل سازنده فرزند، سازنده کلاس والد برای wxPython
کلاس نامیده می شود و parent
و title
صفات به آن منتقل می شود. در نهایت show
روشی برای نمایش فریم فراخوانی می شود. در main()
روش، هدف از WordPlay
کلاس ایجاد می شود.
کد اکنون بسیار ساختارمندتر و تمیزتر به نظر می رسد. درک آن آسان تر است و می توان عملکردهای بیشتری را به طور یکپارچه به کد بالا اضافه کرد.
افزودن قابلیت ها
ما عملکردها را یکی یکی اضافه خواهیم کرد تا از سردرگمی در مورد اینکه کدام قسمت کد برای کدام عملکرد خاص اضافه شده است جلوگیری کنیم. آنچه ما در برنامه اصلی خود می خواهیم یک جعبه متن است که در آن می توانیم متن اضافه کنیم و سپس چند دکمه برای انجام عملکردهای مختلف روی آن متن، مانند محاسبه تعداد کلمات موجود در آن، فراوانی هر کلمه و غیره، و به دنبال آن خروجی نمایش داده می شود. روی صفحه برنامه ما
بیایید با افزودن یک جعبه متن به برنامه خود شروع کنیم که می توانیم متن خود را در آن اضافه کنیم.
import wx
import operator
class WordPlay(wx.Frame):
def __init__(self, parent, title):
super(WordPlay, self).__init__(parent, title=title)
self.widgets()
self.Show()
def widgets(self):
text_box = wx.BoxSizer(wx.VERTICAL)
self.textbox = wx.TextCtrl(self, style=wx.TE_RIGHT)
text_box.Add(self.textbox, flag=wx.EXPAND | wx.TOP | wx.BOTTOM, border=5)
grid = wx.GridSizer(5, 5, 10, 10)
text_box.Add(grid, proportion=2, flag=wx.EXPAND)
self.SetSizer(text_box)
def main():
myapp = wx.App()
WordPlay(None, title='Word Play')
myapp.MainLoop()
main()
همانطور که می بینید، ما یک تابع جدید به نام اضافه کرده ایم widgets()
بالا، و آن را در نامیده شده است WordPlay
سازنده کلاس هدف آن افزودن ویجت های جدید به صفحه نمایش ما است. با این حال، در مورد ما فقط علاقه مند به اضافه کردن یک ویجت هستیم، یعنی یک جعبه متن که در آن می توانیم مقداری متن اضافه کنیم.
بیایید اکنون چند چیز مهم را که در حال انجام است درک کنیم روی داخل این widgets()
تابع. این BoxSizer()
روش، همانطور که از نام پیداست، اندازه ویجت ها و همچنین موقعیت آن (نسبی یا مطلق) را کنترل می کند. این wx.VERTICAL
مشخص می کند که ما یک جهت عمودی برای این ویجت می خواهیم. TextCtrl
اساساً یک جعبه متن کوچک را در جریان فعلی ما اضافه می کند، جایی که کاربر می تواند یک ورودی متن را وارد کند. این GridSizer()
متد به ما کمک می کند یک ساختار جدول مانند برای پنجره خود ایجاد کنیم.
خوب، بیایید ببینیم برنامه ما اکنون چگونه به نظر می رسد.
اکنون یک جعبه متن در پنجره برنامه ما دیده می شود.
بیایید جلوتر برویم و دو دکمه به برنامه خود اضافه کنیم، یکی برای شمارش تعداد کلمات در متن، و دوم برای نمایش بیشترین کلمه تکرار شده. ما این کار را در دو مرحله انجام می دهیم، ابتدا دو دکمه جدید اضافه می کنیم و سپس کنترل کننده های رویداد را به برنامه خود اضافه می کنیم که به ما می گوید کاربر روی کدام دکمه کلیک کرده است، همراه با متن وارد شده در کادر متن، به طوری که عمل خاصی را می توان انجام داد روی ورودی.
افزودن دکمه ها نسبتاً ساده است، فقط نیاز به اضافه کردن کد اضافی به عملکرد “ویجت ها” ما دارد. در بلوک کد زیر، ما فقط عملکرد ویجت های به روز شده را نمایش خواهیم داد. بقیه کد ثابت می ماند.
def widgets(self):
text_box = wx.BoxSizer(wx.VERTICAL)
self.textbox = wx.TextCtrl(self, style=wx.TE_RIGHT)
text_box.Add(self.textbox, flag=wx.EXPAND | wx.TOP | wx.BOTTOM, border=5)
grid = wx.GridSizer(2, 5, 5)
button_list = ('Count Words', 'Most Repeated Word')
for lab in button_list:
button = wx.Button(self, -1, lab)
grid.Add(button, 0, wx.EXPAND)
text_box.Add(grid, proportion=2, flag=wx.EXPAND)
self.SetSizer(text_box)
همانطور که می بینید، اکنون دو دکمه جدید به پنجره اصلی ما نیز اضافه شده است.
اضافه کردن یک رویداد Handler
رابط برنامه ما اکنون آماده است، تنها کاری که اکنون باید انجام دهیم این است که کنترل کننده رویداد را اضافه کنیم تا اقدامات خاصی را با کلیک روی دکمه انجام دهیم. برای آن باید یک تابع جدید ایجاد کنیم و یک خط کد اضافی در تابع ابزارک ها اضافه کنیم. بیایید با نوشتن تابع خود شروع کنیم.
def event_handler(self, event):
btn_label = event.GetEventObject().GetLabel()
text_entered = self.textbox.GetValue()
words_list = text_entered.split()
if btn_label == "Count Words":
result = len(words_list)
elif btn_label == "Most Repeated Word":
word_dict = {}
for word in words_list:
if word in word_dict:
word_dict(word) += 1
else:
word_dict(word) = 1
sorted_dict = sorted(word_dict.items(),
key=operator.itemgetter(1),
reverse=True)
result = sorted_dict(0)
self.textbox.SetValue(str(result))
منطق پشت ویژگی “تکرارترین کلمه” این است که ما ابتدا یک حلقه را اجرا می کنیم که از طریق کلمات از لیست همه کلمات تکرار می شود. سپس بررسی می کند که آیا آن کلمه خاص از قبل در فرهنگ لغت وجود دارد یا خیر. اگر این کار را کرد، به این معنی است که در حال تکرار است، و هر بار که کلمه دوباره ظاهر می شود، مقدار آن یک عدد افزایش می یابد. در غیر این صورت، اگر در فرهنگ لغت وجود نداشته باشد، به این معنی است که برای اولین بار در جمله ظاهر شده است، و مقدار “وقوع” آن باید روی 1 تنظیم شود. در نهایت، دیکشنری را مرتب می کنیم (مشابه مرتب سازی لیست پایتون). ) به ترتیب نزولی به طوری که کلمه با بیشترین مقدار (فرکانس) بیرون بیاید روی بالا، که سپس می توانیم نمایش دهیم.
بسیار خوب، پس اکنون که محاسبه/عملی را که باید با کلیک روی یک دکمه خاص انجام شود، نوشتیم، بیایید آن عمل را به آن دکمه خاص “پیوند” کنیم. برای آن، ما باید کمی خود را اصلاح کنیم widgets
تابع.
for lab in button_list:
button = wx.Button(self, -1, lab)
self.Bind(wx.EVT_BUTTON, self.event_handler, button)
grid.Add(button, 0, wx.EXPAND)
در کد بالا، self.Bind
فراخوانی جایی است که اتصال رخ می دهد. کاری که انجام می دهد این است که یک عمل خاص را به یک دکمه خاص پیوند می دهد، به طوری که وقتی روی آن دکمه کلیک می کنید، یک عمل خاص مرتبط با آن انجام می شود. در مورد خاص ما، ما فقط یک تابع مدیریت رویداد داریم که هر دو عملکرد را با بررسی در زمان اجرا بررسی میکند که کدام دکمه از طریق ویژگی ‘label’ کلیک شده است و سپس اقدام مرتبط را انجام میدهد. بنابراین در self.Bind
فراخوانی می کنیم که همه دکمه های خود را به یک تابع “event_handler” متصل می کنیم.
بسیار خوب، پس کد ما اکنون کامل است. بیایید هر دو ویژگی خود را امتحان کنیم و ببینیم که آیا همه آنطور که انتظار میرود کار میکند یا خیر.
در مرحله اول مطابق شکل زیر یک رشته را در کادر متن وارد می کنیم:
در مرحله بعد، اگر روی دکمه “شمارش کلمات” کلیک کنیم، باید “7” را در کادر متن مشاهده کنید زیرا 7 کلمه در رشته وجود دارد.
تا اینجای کار خیلی خوبه!
حالا بیایید مانند شکل زیر یک رشته دیگر در کادر متن بنویسیم:
اکنون، اگر روی دکمه “بیشترین کلمه تکراری” کلیک کنیم، مانند شکل زیر، بیشترین تکرار کلمات را در کادر متن به همراه تعداد دفعات وقوع آن مشاهده خواهید کرد:
کاملاً کار می کند!
ما فقط دو ویژگی اضافه کردهایم، اما هدف این بود که به شما نشان دهیم همه این مؤلفهها چگونه به هم متصل شدهاند، میتوانید به سادگی با نوشتن توابع اضافی برای آنها، هر تعداد قابلیتی که میخواهید اضافه کنید. علاوه بر این، این آموزش تمرکز زیادی نداشت روی زیبایی شناسی ویجت های زیادی در wxPython برای زیباسازی برنامه شما وجود دارد که اکنون دانش اولیه جعبه ابزار را درک کرده اید.
نتیجه
به طور خلاصه، متوجه شدیم که wxPython به طور رایج برای توسعه برنامههای دسکتاپ مبتنی بر رابط کاربری گرافیکی در پایتون استفاده میشود، و پایتون نیز جایگزینهای جالب دیگری برای آن دارد. برای دانلود و نصب آن دستورات را مرور کردیم روی همه سیستم عامل های محبوب در نهایت، ما یاد گرفتیم که چگونه با استفاده از wxPython یک برنامه مدولار شده بسازیم که به راحتی قابل گسترش است، همانطور که در این آموزش که در آن ساخته شدیم دیده می شود. روی یک برنامه اسکلت اولیه و افزودن ویژگی های بیشتر مرحله به مرحله.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-21 09:31:03