کتابخانه PyAutoGUI: قسمت دوم

بسم الله الرحمن الرحیمسلام؛ بالاخره قسمت دوم هم آماده شد!! ? اگر هنوز قسمت اول رو ندیدید:کتابخانه PyAutoGUI چیست؟کتابخانه PyAutoGUI یکی از کتابخانه های زبان پایتون می باشد که به ما اجازه می دهد تا فرآیند استفاده از موس و کیبورد خود را به صورت خودکار کنترل کنیم. در حال حاضر این کتابخانه در سه سیستم عامل لینوکس، مک و ویندوز قابل استفاده بوده و به هر دو نسخه 2 و 3 پایتون قابل اجراست. https://virgool.io/@MahdiMoosivand/%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-pyautogui-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-brr4zgebnwns کتابخانه PyAutoGUIتایپ کردنبرای تایپ کردن، کتابخانه PyAutoGUI یه تابع ساده داره:>>> pyautogui.write(&quotHello world!&quot) >>> pyautogui.write(&quotHello world!&quot, interval=0.25)این تابع، به غیر از متنی که می نویسه یه پارامتر دیگه هم میگیره که مربوط به فاصله زمانی میان تایپ هر کاراکتر است. مثلا اگر کلمه "Hello" رو با زمان 0.25 به این تابع بدیم، فرآیند تایپ 1 ثانیه (4 * 0.25) طول می کشه. در واقع با این کار یه مکث و تاخیر بین تایپ کردن هر کاراکتر ایجاد میشه. نگه داشتن و فشردن کلید های کیبورداگر می خواهید پس از این که متنی توسط تابع write نوشته شد، کلید اینتر رو هم بزنید یا مثلا می خواهید یه برنامه بنویسید که کلید شیفت رو نگه داره و اون رو روی کامپیوتر دوستتون اجرا کنید تا وقتی داره تایپ می کنه، همه حروف بزرگ نوشته بشه! ?? باید از این توابع استفاده کنید:برای فشردن یک کلید:>>> pyautogui.press(&quotenter&quot) >>> pyautogui.press(&quotf1&quot) >>> pyautogui.press(&quotleft&quot)اگر قصد دارید چند کلید رو فشار بدید، از یک لیست استفاده کنید:>>> pyautogui.press([&quotleft&quot, &quotleft&quot, &quotleft&quot, &quotenter&quot])اگر بخواهید، به تعداد دلخواهی یک کلید رو فشار بدید:>>> pyautogui.press(&quotleft&quot, presses=3)اگر بخواهید یه تاخیر و مکث بین هر مرتبه داشته باشید:>>> pyautogui.press(&quotleft&quot, presses=3, interval=0.25)برای نگه داشتن یک کلید:>>> pyautogui.keyDown(&quotshift&quot)برای آزاد کردن کلیدی که قبلا نگه داشته شده:>>> pyautogui.keyUp(&quotshift&quot)استفاده از کلید های میانبرخب، فکر نکنم اینم نیاز به توضیح خاصی داشته باشه:>>> pyautogui.hotkey(&quotctrl&quot, &quotc&quot) >>> pyautogui.hotkey(&quotctrl&quot, &quotv&quot)در واقع کد بالا این معنی رو داره:>>> pyautogui.keyDown(&quotctrl&quot) >>> pyautogui.keyDown(&quotc') >>> pyautogui.keyUp(&quotctrl&quot) >>> pyautogui.keyUp(&quotc&quot) >>> pyautogui.keyDown(&quotctrl&quot) >>> pyautogui.keyDown(&quotv') >>> pyautogui.keyUp(&quotctrl&quot) >>> pyautogui.keyUp(&quotv&quot)همچنان می تونید از پارامتر interval استفاده کنید؛ ولی من نفهمیدم چه کاربردی داره؟!>>> pyautogui.hotkey(&quotshift&quot, &quotdel&quot, interval=0.5)فکر کنم، تو مثال بالا دلش نمیاد پاکش کنه!! ??برای این که کارتون راحت بشه، اینجا یه لیستی از کلید های کیبورد رو براتون گذاشتم:['\t', '\n', '\r', ' ', '!', '&quot', '#', '$', '%', '&', &quot'&quot, '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']کادر های پیغامکتابخانه PyAutoGUI امکانات خیلی خوبی داره، یکی از این امکانات نمایش جعبه های پیغام هست؛ مثلا اگر بخواهید یک هشدار روی صفحه نشون داده بشه، می تونید از این تابع استفاده کنید:>>> pyautogui.alert(text=&quotاتصال به اینترنت امکان پذیر نیست.&quot, title=&quotخطای 149&quot, button=&quotتلاش دوباره&quot)اگر بخواهیم چند تا گزینه داشته باشیم، از تابع confirm استفاده می کنیم:>>> pyautogui.confirm(text=&quotChera Mask nazadi?!&quot, title=&quotKhataye Behdashti&quot, buttons=[&quotNadaram!&quot, &quotOK, Mi zanam.&quot])اشتباه نشه، اصلا منظور من در گزینه اول عقل نبود. اصلا!! ?+ اگر بخوام یه متن از کاربر بگیرم، چی کار کنم؟ - از این تابع استفاده کن:>>> pyautogui.prompt(text=&quot&quot, title=&quot&quot , default=&quot&quot)+ اگر بخوام گذرواژه بگیرم، چی؟ - بفرما:>>> pyautogui.password(text=&quot&quot, title=&quot&quot, default=&quot&quot, mask=&quot*&quot)لازم به ذکره که توابع این بخش ورودی کاربر رو بر می گرودنن و می تونید توی یه متغیر ذخیره اش کنید.پیشنهاد می کنم یه ذره با این توابع ور برید. مثلا در قسمت دریافت گذرواژه بجای ستاره، @ بزاره!قابل توجه جاوا اسکریپت کار ها، این بخش براتون آشنا نبود؟ ?گرفتن تصویر از صفحهگرفتن تصویر از صفحه کتابخانه PyAutoGUI می تواند از صفحه عکس بگیرد؛ این خیلی عالیه!!چنانچه در این بخش مشکلی داشتید، به اینجا سر بزنید.برای گرفتن تصویر از صفحه از تابع screenshot استفاده می کنیم؛ برای ذخیره کردن هم می تونیم یه اسم براش بزاریم:>>> im1 = pyautogui.screenshot() >>> im2 = pyautogui.screenshot(&quotmy_screenshot.png&quot)فرآیند گرفتن تصویر در یک نمایشگر ۱۹۲۰*۱۰۸۰ تقریبا ۱۰۰ میلی ثانیه طول می کشد که قابل قبول است.+ اگر تنها نیاز به گرفتن تصویر از یه بخش صفحه رو داشته باشم، چی؟ - اینو ببین:>>> im = pyautogui.screenshot(region=(0, 0, 300, 400))توضیحش میشه این که ما یه Tuple چهارتایی از اعداد صحیح به تابع میدیم که دو پارامتر آخر، طول و عرض یک مستطیل هستند که از مختصات تعیین شده در دو پارامتر اول کشیده می شوند.فکر نکنم متوجه شده باشید، پیشنهاد می کنم، حتما خودتون تستش کنید. ?پیدا کردن یک تصویر در صفحه نمایشگر (هوش مصنوعی!)چنانچه در این بخش مشکلی داشتید، به اینجا سر بزنید.فرض کنید، چنین پنجره ای در صفحه شما باز شده است:پنجره ماشین حسابدر صورتی که مختصات دقیق کلید های ماشین حساب رو نداشته باشید نمی تونید با توابع moveTo و click روی کلید ها کلیک کنید. همچنین ممکن است هر بار که برنامه ماشین حساب رو باز می کنید، مختصات کلید ها تغییر پیدا کند. در این شرایط اگر یک تصویر از کلید های آن داشته باشید، این مشکل به سادگی حل می شود!calc7key.png>>> pyautogui.locateOnScreen(&quotcalc7key.png&quot) Box(left=1416, top=562, width=50, height=41)مقدار برگردانده شده دقیقا مانند مقداری هست که در بخش «گرفتن تصویر از یه بخش صفحه» به تابع می دهیم. همچنین با تابع center می تونیم مختصات وسط دکمه رو به راحتی پیدا کنیم:>>> pyautogui.center(pyautogui.locateOnScreen(&quotcalc7key.png&quot)) Point(x=1441, y=582)برای کد بالا یه راه حل ساده تر هم هست:>>> pyautogui.locateCenterOnScreen(&quotcalc7key.png&quot) Point(x=1441, y=582)این فرآیند بر روی صفحه نمایشگری با ابعاد ۱۹۲۰*۱۰۸۰ در حدود ۱ یا ۲ ثانیه طول می کشد. این زمان ممکن است برای بازی های ویدیویی بسیار کند باشد؛ اما برای اغلب مقاصد و کاربرد ها کارساز است.همچنین اگر بخواهیم دقت پیدا کردن تصویر رو کم و زیاد کنیم:>>> pyautogui.locateOnScreen(&quotcalc7key.png&quotو confidence=0.9) Box(left=1416, top=562, width=50, height=41)توجه داشته باشید که برای تعیین دقت یافتن تصویر باید کتابخانه OpenCV رو روی سیستمتون نصب کنید.در صورتی که بخواهیم منطقه مورد جست و جو رو (در یک بخش خاصی از صفحه) تعیین کنیم:>>> pyautogui.locateOnScreen(&quotsomeButton.png&quot, region=(0,0, 300, 400)) Box(left=16, top=70, width=50, height=41)با این روش هم می تونید یه ذره دقت کار رو بیارید پایین تا حدود 30% سرعت رو کم کنیم:>>> pyautogui.locateOnScreen(&quotcalc7key.png&quot, grayscale=True) Box(left=16, top=70, width=50, height=41)لازم به ذکره که در حالت بالا، از یک روش متفاوت برای پیداکردن مختصات استفاده میشه و اگر صفحتون در حال اجرای برنامه خیلی رنگارنگه، این روش مناسب شما نیست!کتابخانه PyAutoGUI در این مورد امکانات دیگری هم داره که به زبان انگلیسی براتون گذاشتم:locateOnScreen(image, grayscale=False) - Returns (left, top, width, height) coordinate of first found instance of the image on the screen. Raises ImageNotFoundException if not found on the screen.locateCenterOnScreen(image, grayscale=False) - Returns (x, y) coordinates of the center of the first found instance of the image on the screen. Raises ImageNotFoundException if not found on the screen.locateAllOnScreen(image, grayscale=False) - Returns a generator that yields (left, top, width, height) tuples for where the image is found on the screen.locate(needleImage, haystackImage, grayscale=False) - Returns (left, top, width, height) coordinate of first found instance of needleImage in haystackImage. Raises ImageNotFoundException if not found on the screen.locateAll(needleImage, haystackImage, grayscale=False) - Returns a generator that yields (left, top, width, height) tuples for where needleImage is found in haystackImage.کار با رنگ هاکار با رنگ هایکی دیگر از امکانات خوب این کتابخانه اینه که می تونه رنگ یک نقطه از صفحه نمایش رو به ما بده:>>> pyautogui.pixel(100, 200) RGB(red=130, green=135, blue=144)یه امکان دیگه ای هم که هست اینه که می تونید ببینید اون نقطه از صفحه رنگ مورد نظر شما رو داره یا نه:>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144)) True >>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134)) False >>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134), tolerance=10) Trueدر مورد tolerance کافیه که بدونید هر چی بیشتر بشه، دقت کار میاد پایین (البته یه سقفی هم داره.)؛ توضیحاتش مفصله. دوستانی که تا حالا طراحی گرافیک کرده باشند، شاید متوجه بشوند.لازمه که بگم در این توابع، جهت رنگ دهی از سیستم RGB استفاده شده.خب، قسمت دوم هم تمام شد!!! در قسمت بعد قراره چند تا از برنامه هایی که قبلا با این کتابخانه نوشتم و چند تا از ایده هایی که دارم رو مطرح کنم. این قسمت، قسمت آخر از توضیحات مستندات کتابخانه PyAutoGUI بود. دوست دارم نظرات، انتقادات و پیشنهاداتتون رو بدونم؛ اگر سوالی داشتید یا به مشکلی برخوردید حتما به من بگید تا اگر تونستم، کمکتون کنم. ? موفق باشید.Ways to communicate with me:* E-mail: MahdiMoosivand@outlook.com* Gap: @MahdiMoosivandTranslated by Mahdi Moosivand.Click here to view the original documentation.اللهم صل علی محمد و آل محمد و عجل فرجهم. :)آپدیت (15 آگوست 2020): به دلایلی فعلا قادر به انتشار آموزش پروژه محور (قسمت سوم) نخواهم بود. ?