وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

0 84
زمان لازم برای مطالعه: 7 دقیقه


معرفی

در این آموزش قصد داریم روش استفاده را یاد بگیریم 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 در دستور بالا

پس از اجرای برنامه، باید پنجره خالی زیر را مشاهده کنید روی صفحه نمایش شما:

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

کد شی گرا

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

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() متد به ما کمک می کند یک ساختار جدول مانند برای پنجره خود ایجاد کنیم.

خوب، بیایید ببینیم برنامه ما اکنون چگونه به نظر می رسد.

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

اکنون یک جعبه متن در پنجره برنامه ما دیده می شود.

بیایید جلوتر برویم و دو دکمه به برنامه خود اضافه کنیم، یکی برای شمارش تعداد کلمات در متن، و دوم برای نمایش بیشترین کلمه تکرار شده. ما این کار را در دو مرحله انجام می دهیم، ابتدا دو دکمه جدید اضافه می کنیم و سپس کنترل کننده های رویداد را به برنامه خود اضافه می کنیم که به ما می گوید کاربر روی کدام دکمه کلیک کرده است، همراه با متن وارد شده در کادر متن، به طوری که عمل خاصی را می توان انجام داد روی ورودی.

افزودن دکمه ها نسبتاً ساده است، فقط نیاز به اضافه کردن کد اضافی به عملکرد “ویجت ها” ما دارد. در بلوک کد زیر، ما فقط عملکرد ویجت های به روز شده را نمایش خواهیم داد. بقیه کد ثابت می ماند.



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)

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

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

اضافه کردن یک رویداد 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” متصل می کنیم.

بسیار خوب، پس کد ما اکنون کامل است. بیایید هر دو ویژگی خود را امتحان کنیم و ببینیم که آیا همه آن‌طور که انتظار می‌رود کار می‌کند یا خیر.

در مرحله اول مطابق شکل زیر یک رشته را در کادر متن وارد می کنیم:

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

در مرحله بعد، اگر روی دکمه “شمارش کلمات” کلیک کنیم، باید “7” را در کادر متن مشاهده کنید زیرا 7 کلمه در رشته وجود دارد.

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

تا اینجای کار خیلی خوبه!

حالا بیایید مانند شکل زیر یک رشته دیگر در کادر متن بنویسیم:

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

اکنون، اگر روی دکمه “بیشترین کلمه تکراری” کلیک کنیم، مانند شکل زیر، بیشترین تکرار کلمات را در کادر متن به همراه تعداد دفعات وقوع آن مشاهده خواهید کرد:

ایجاد برنامه های رابط کاربری گرافیکی پایتون با wxPython

کاملاً کار می کند!

ما فقط دو ویژگی اضافه کرده‌ایم، اما هدف این بود که به شما نشان دهیم همه این مؤلفه‌ها چگونه به هم متصل شده‌اند، می‌توانید به سادگی با نوشتن توابع اضافی برای آن‌ها، هر تعداد قابلیتی که می‌خواهید اضافه کنید. علاوه بر این، این آموزش تمرکز زیادی نداشت روی زیبایی شناسی ویجت های زیادی در wxPython برای زیباسازی برنامه شما وجود دارد که اکنون دانش اولیه جعبه ابزار را درک کرده اید.

نتیجه

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

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-21 09:31:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید