Recent

Plateform : Micro:bit

ชุดบอร์ด micro:bit ชุดทดลองที่น้าสนใจ โดยเฉพาะเด็กๆ และผู้เริ่มต้นเขียนโปรแกรมแบบ บล็อค ของเล่ยนมากมาย

อย่าหยุดที่จะเรียนรู้

ครูโป้ง ก็ไปเรียนเพิ่มได้ความรู้มาเพิ่มพูน ไม่หยุดนิ่ง ลงทุนบ้าง เสาะหาบ้าง

ชุด ioT กับ ESP8266

iot คือทุกอย่างสามารถเชิ่อมต่อบนโลกอินเตอร์เน็ต เชื่อมโลกได้ สั่งได้ทั่วโลก

วิ่งปรู๊ด ตามเส้นไป กับ Arduino

โครงงานรถยนต์กับ Aruino

AR vs VR

เชื่อมโลกเสมือนไปกับ AR และ VR

20 ธันวาคม 2563

บันทึก : ควบคุมเมาส์และคีย์บอร์ดใน Python กับ pyautogui

บันทึก : ควบคุมเมาส์และคีย์บอร์ดใน Python  กับ pyautogui

บันทึกก่อน เดี๋ยวค่อยมาเรียน 

Link: ที่มาบทความ
https://phyblas.hinaboshi.com/20170101
Image for post
ภาพจาก https://www.cringely.com

pyautogui เป็นมอดูลสำหรับใช้ควบคุมเมาส์และคีย์บอร์ดซึ่งเขียนด้วยภาษาไพธอน

เราสามารถใช้เพื่อสั่งให้เครื่องคอมทำอะไรต่างๆเองตามที่เราเขียนโปรแกรมไว้ได้ เหมือนเป็นการสร้างบอตขึ้นมาช่วยทำงานแทนเรา


การติดตั้ง และเริ่มใช้งาน
สามารถติดตั้งได้ง่ายดายโดยใช้ pip สำหรับ windows นั้นสามารถลง pyautogui ได้ทันที
pip install pyautogui

แต่สำหรับ mac นั้นจะต้องลงอย่างอื่นก่อน ตามนี้
pip install pyobjc-core
pip install pyobjc
pip install pyautogui

หลังลงเสร็จแล้วพอต้องการใช้ก็ import ตามปกติ
import pyautogui

เนื่องจากชื่อยาวอาจเป็นการดีที่จะย่อมันสักหน่อยเวลาใช้ อย่างไรก็ตามตัวอย่างส่วนใหญ่ที่เจอก็ใช้เต็มไม่ได้ย่อดังนั้นในที่นี้ก็จะเขียนเต็มๆตามนั้น
การคลิกเมาส์
เริ่มลองจากคำสั่งแรกคือ click

แค่ลองพิมพ์ไปว่า
pyautogui.click()

พอรันโค้ดเมาส์ก็จะถูกคลิกตรงตำแหน่งที่วางอยู่ทันที

แต่หากต้องการระบุว่าจะคลิกตรงไหนก็ให้ใส่พิกัดตำแหน่งลงไปด้วย โดยค่าที่ใส่คือค่าตำแหน่งนับจากบนซ้ายสุด โดยหน่วยเป็นพิกเซล เช่น
pyautogui.click(500,400)

เท่านี้เมาส์ก็จะเลื่อนไปยังตำแหน่งนั้นแล้วค่อยคลิก

เพียงแต่การที่จะใช้วิธีนี้ได้เราจะต้องรู้ว่าสิ่งที่ต้องการคลิกอยู่ตรงไหน เพื่อที่จะรู้ได้มีคำสั่งที่สะดวกมากอยู่ นั่นก็คือ position

แค่พิมพ์ว่า
print(pyautogui.position()) # ได้ (346,551)

พอรันไปมันก็จะแสดงตำแหน่งที่เมาส์ชี้อยู่ปัจจุบัน พอเราได้ค่าตำแหน่งของสิ่งต่างๆที่ต้องการแล้วก็เอามาใช้กับคำสั่ง click หรือคำสั่งอื่นๆที่ต้องการระบุตำแหน่ง แบบนี้ก็สะดวกดี

นอกจากนี้หากอยากรู้ว่าจอเรากว้างเท่าไหร่ก็ใช้คำสั่ง size ได้ จะคืนค่าขนาดของจอออกมา เช่น
print(pyautogui.size()) # ได้ (1280,800)



การคลิกเมาส์หลายครั้ง
ปกติคำสั่ง click จะทำการคลิกเมาส์แค่ครั้งเดียว แต่หากต้องการคลิกหลายครั้งก็ทำได้ง่ายโดยเพิ่มอาร์กิวเมนต์ตัวที่ ๓ เข้าไป เป็นจำนวนครั้ง เช่น ถ้าต้องการให้คลิก ๓ ครั้งก็
pyautogui.click(100,200,3)

หรือถ้าจะไม่ระบุตำแหน่งก็ใส่ในรูปคีย์เวิร์ด clicks ได้
pyautogui.click(clicks=3)

ปกติแล้วเมาส์จะคลิกกดอย่างต่อเนื่องในพริบตา แต่หากต้องการให้เว้นช่วงก็ทำได้โดยเพิ่มคียเวิร์ด interval ลงไป โดยใส่ระยะเวลาที่ต้องการเว้นเป็นหน่วยวินาที
pyautogui.click(700,300,7,interval=0.5)

แบบนี้ก็จะเป็นการคลิก ๗ ครั้งโดยเว้นระยะห่างครั้งละครึ่งวินาที

นอกจากนี้กรณีคลิก ๒ หรือ ๓ ครั้งมีคำสั่งที่อาจใช้แทนได้อีก นั่นคือ doubleClick สำหรับคลิก ๒ ครั้ง และ tripleClick สำหรับคลิก ๓ ครั้ง

เช่น
pyautogui.doubleClick(150,240)
pyautogui.tripleClick(250,300)



การคลิกขวาและคลิกกลาง
คำสั่ง click (รวมถึง doubleClick, tripleClick) ปกติจะเป็นการคลิกซ้าย แต่หากต้องการให้เป็นการคลิกขวาหรือคลิกกลางก็สามารถทำได้โดยเพิ่มคีย์เวิร์ด button

หากต้องการคลิกกลางให้ใส่ค่าเป็น middle หรือ 2

หากต้องการคลิกขวาให้ใส่ค่าเป็น right หรือ 3

ส่วนคลิกซ้ายนั้นที่จริงไม่ต้องใส่ก็ไดด้แต่ถ้าจะใส่ก็ใส่เป็น left หรือ 1

ตัวอย่างเช่น
pyautogui.click(500,100,button=3)

แบบนี้ก็จะเป็นการคลิกขวา

นอกจากนี้ยังมีคำสั่งเฉพาะสำหรับคลิกขวาด้วย คือ rightClick และคำสั่งสำหรับคลิกกลางคือ middleClick เช่น หากพิมพ์
pyautogui.rightClick(500,100)

ก็จะให้ผลเหมือนกับที่ใช้ button=3

เพียงแต่ว่าคำสั่ง rightClick กับ middleClick จะกำหนดจำนวนครั้งที่คลิกไม่ได้ ปกติจะใช้คลิกครั้งเดียว



การเลื่อนเมาส์
คำสั่งที่ใช้เลื่อนเมาส์ให้ไปยังจุดที่ต้องการคือ moveTo โดยใส่ตำแหน่งจุดที่ต้องการให้เมาส์ย้ายไป
pyautogui.moveTo(640,400)

เมาส์จะย้ายไปตำแหน่งที่ระบุทันที

แต่หากต้องการให้เมาส์ย้ายโดยกำหนดตำแหน่งเมื่อเทียบกับตำแหน่งปัจจุบันให้ใช้คำสั่ง moveRel เช่น
pyautogui.moveRel(100,-100)

เมาส์จะเลื่อนไปทางขวาบนเทียบกับตำแหน่งเดิม

หากไม่ต้องการให้เมาส์ย้ายไปตรงนั้นทันทีแต่ต้องการให้รอเวลาสักหน่อยก็ทำได้โดยใส่อาร์กิวเมนต์ตัวที่ ๓ ลงไปเป็นค่าระยะเวลา เช่น
pyautogui.moveRel(500,-500,3)

แบบนี้เมาส์ก็จะค่อยๆเคลื่อนไปโดยใช้เวลา ๓ วินาที



การกดเมาส์ค้างและลาก
ปกติเวลาใช้คำสั่ง click คือการคลิกเมาส์นั่นคือการกดเมาส์แล้วตามด้วยปล่อยเมาส์ทันที แต่หากต้องการแค่กดเมาส์ลงโดยไม่ปล่อยเมาส์ก็ใช้คำสั่ง mouseDown และหากต้องการปล่อยเมาส์ก็ใช้คำสั่ง mouseUp

ตัวอย่างเช่นหากสั่งแบบนี้ก็จะเป็นการกดเมาส์แล้วปล่อยทันที เท่ากับการใช้คำสั่ง click ทีเดียว
pyautogui.mouseDown()
pyautogui.mouseUp()

ทั้งสองคำสั่งก็สามารถระบุตำแหน่งพิกัดได้เช่นเดียวกับ click เช่นหากต้องการให้เมาส์ลากจากจุดหนึ่งไปอีกจุดหนึ่งก็ พิมพ์เป็น
pyautogui.mouseDown(215, 186)
pyautogui.mouseUp(188, 343)

สำหรับการลากเมาส์นั้นยังอาจใช้อีกคำสั่งซึ่งสะดวกกว่า นั่นคือ dragTo คำสั่งนี้จะทำการลากเมาส์จากจุดที่เมาส์อยู่ตอนแรกไปยังจุดที่ระบุ

หากลองพิมพ์
pyautogui.moveTo(215, 186)
pyautogui.dragTo(188, 343)

ก็จะให้ผลเหมือนกับที่ใช้ mouseDown และ mouseUp

นอกจากนี้ยังมีคำสั่ง dragRel ซึ่งเอาไว้เลื่อนในตำแหน่งที่สัมพัทธ์กับตำแหน่งเดิม

เช่น ให้เลื่อนไปทางขวาล่างร้อยพิกเซล
pyautogui.dragRel(100,100)

ทั้ง mouseDown, mouseUp, dragTo และ dragRel ต่างก็สามารถใช้กับเมาส์กลางและเมาส์ขวาได้โดยกำหนดคีย์เวิร์ด button

dragTo และ dragRel สามารถกำหนดระยะเวลาลากได้ด้วยการใส่อาร์กิวเมนต์ตัวที่ ๓ ลงไปเป็นระยะเวลาเช่นเดียวกับใน moveTo และ moveRel

เช่นลองให้ค่อยๆลากไปโดยใช้เวลา ๒ วินาที
pyautogui.dragRel(100,100,2)



การหมุนลูกเลื่อนเมาส์
หากต้องการหมุนลูกเลื่อนเมาส์ก็ใช้คำสั่ง scroll โดยต้องใส่ค่าปริมาณการหมุนลงไป โดยถ้าค่าบวกเป็นการหมุนขึ้นบน ค่าถ้าลบเป็นการหมุนลงข้างล่าง เช่น
pyautogui.scroll(-10)

แบบนี้จะเป็นการหมุนลงข้างล่าง

สำหรับใน mac สามารถหมุนลูกเลื่อนในแนวนอนได้ด้วย จะสามารถใช้คำสั่ง hscroll เพื่อหมุนแนวนอนได้ เช่น
pyautogui.hscroll(10)

การพิมพ์ตัวอักษรบนคีย์บอร์ด
คำสั่งสำหรับพิมพ์ตัวอักษรจากคีย์บอร์ดเสมือนกับว่าเรากำลังเอามือกดแป้นพิมพ์อยู่ก็คือ typewrite การใช้ก็แค่ใส่ข้อความที่ต้องการพิมพ์ลงไป เช่น
pyautogui.typewrite('sawatdi')

เพียงแต่ต้องระวังว่าตัวที่ใส่ต้องเป็นอักษรที่อยู่บนแป้นคีย์บอร์ดภาษาอังกฤษเท่านั้น คำสั่งนี้แค่เป็นตัวสั่งให้กดแป้นคีย์บอร์ดแป้นนั้น หากต้องการพิมพ์ภาษาอื่นก็ต้องเทียบตำแหน่งแป้นพิมพ์เอา

ดังนั้นหากต้องการพิมพ์คำว่า "สวัสดี" ก็ให้ตั้งคีย์บอร์ดเป็นภาษาไทยไว้แล้วพิมพ์ว่า
pyautogui.typewrite('l;ylfu')

หากต้องการให้เว้นระยะเวลาในการพิมพ์แต่ละตัวก็ให้ใส่คีย์เวิร์ด interval เพิ่มเข้าไป เช่น
pyautogui.typewrite('l;ylfu',interval=0.1)

ในการใส่อักษรจะใส่ในรูปของลิสต์ทีละตัวอักษรก็ทำได้เช่นกัน
pyautogui.typewrite(['l',';','y','l','f','u'])



การสั่งให้กดปุ่ม
นอกจากปุ่มบนแป้นพิมพ์ที่เป็นตัวอักษรแล้วยังสามารถสั่งพวกปุ่มคำสั่งต่างๆบนแป้นพิมพ์ได้ด้วย เช่น
pyautogui.typewrite(['enter'])

แบบนี้จะเป็นการกด enter

เพียงแต่ว่าต้องเขียนในรูปของลิสต์ ถ้าใส่เป็น
pyautogui.typewrite('enter')

แบบนี้จะกลายเป็นเราสั่งให้พิมพ์คำว่า enter แบบนี้ไม่มีความหมาย

นอกจากนี้ยังมีอีกคำสั่งที่ใช้สั่งให้กดปุ่มได้เช่นกัน คือ press ถ้าต้องการให้กด enter ก็แค่พิมพ์
pyautogui.press('enter')

หากอยากรู้ว่าปุ่มไหนใช้ได้สามารถดูได้ที่ค่าแอตทริบิวต์ KEYBOARD_KEYS
print(pyautogui.KEYBOARD_KEYS)

เท่านี้ปุ่มทั้งหมดที่ใช้ได้ก็จะแสดงออกมา
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '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', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']

หากต้องการกดหลายปุ่มต่อๆกันไปก็ใส่ในรูปของลิสต์ กรณีนี้จะใช้ press หรือ typewrite ก็เหมือนกัน
pyautogui.press(['enter','left'])
# หรือ pyautogui.typewrite(['enter','left'])

แต่ press สามารถสั่งให้กดปุ่มเดิมซ้ำหลายครั้งได้ เช่น
pyautogui.press('enter',4)
# เท่ากับ pyautogui.typewrite(['enter','enter','enter','enter'])

จะให้วนซ้ำเป็นชุดหลายตัวก็ได้
pyautogui.press(['left','right'],40)

press สามารถใส่คีย์เวิร์ด interval ได้เช่นเดียวกัน แต่ความหมายจะต่างจากใช้กับ typewrite คือจะเป็นการเว้นช่วงในแต่ละรอบที่มีการซ้ำ ไม่ใช่การเว้นระหว่างแต่ละคีย์ในรอบ

เช่น ลองให้พิมพ์แล้วลบ สลับไปเรื่อยๆ
pyautogui.press(['o','k','backspace','backspace'],20,interval=0.3)



การกดปุ่มค้างไว้และการใช้ฮ็อตคีย์
เวลาใช้ press จะเป็นการกดปุ่มแล้วปล่อยทันที แต่หากต้องการแค่ให้กดปุ่มแช่ไว้ก็จะใช้คำสั่ง keyDown

จากนั้นเมื่อต้องการให้ปล่อยปุ่มก็ใช้คำสั่ง keyUp

ตัวอย่างเช่น ลองให้เขียนตัวอักษรขึ้นมาแล้วลากคลุมให้หมด
pyautogui.typewrite('12345')
pyautogui.keyDown('shift')
pyautogui.press('left',5)
pyautogui.keyUp('shift')

หรือกรณีที่จะใช้ฮ็อตคีย์ เช่น ctrl-a (ใน mac เป็น command-a) คือการลากคลุมอักษรทั้งหมด ก็กดแบบนี้
pyautogui.keyDown('ctrl')
pyautogui.press('a')
pyautogui.keyUp('ctrl')

การเขียนแบบนี้ออกจะดูยุ่งยากเล็กน้อย ที่จริงแล้วมีคำสั่งที่ช่วยให้ทำแบบนี้ได้ง่ายกว่า นั่นคือใช้คำสั่ง hotkey

เช่น สามบรรทัดนั้นอาจเขียนแทนด้วย
pyautogui.hotkey('ctrl','a')
# สำหรับ mac จะเป็น pyautogui.hotkey('command','a')

แบบนี้ก็เท่ากับการกดปุ่ม ctrl แล้วค่อยกด a จากนั้นก็ค่อยปล่อย ctrl อีกที

จะใส่ทีกี่ตัวก็ได้ เช่น ๓ ตัว
pyautogui.hotkey('ctrl','alt','del')



การหน่วงเวลา
ปกติถ้าเราเขียนคำสั่งต่อเนื่องเวลารันแล้วคำสั่งจะถูกทำต่อเนื่องไปทันที แต่ถ้าหากหน่วงเวลาให้มีการเว้นช่วงก็สามารถทำได้โดยใช้คำสั่ง sleep จากมอดูล time

เช่น
import time
pyautogui.click(200,200)
time.sleep(1)
pyautogui.click(400,300)

แบบนี้จะเป็นการหยุด ๑ วินาทีหลังคำสั่งแรก

หรืออีกวิธีหนึ่งที่น่าจะง่ายกว่าก็คือการเพิ่มคีย์เวิร์ด pause ลงไปในฟังก์ชัน ก็จะเป็นการหยุดหลังจากทำคำสั่งเสร็จตามเวลาที่กำหนด เช่น
pyautogui.moveRel(50,-50,pause=1)
pyautogui.moveRel(60,100)

ทุกคำสั่งของ pyautogui สามารถใส่ pause ลงไปได้หมด

นอกจากนี้สำหรับบางฟังก์ชัน เช่น click หรือ press ก็มีอีกวิธีหนึ่งก็คือใส่ interval ก็จะให้ผลเหมือนกับใส่ pause
pyautogui.click(200,200,interval=1)
pyautogui.click(400,300)

เพราะปกติ interval ใช้กำหนดช่วงเวลาที่รอระหว่างการคลิกแต่ละครั้ง ถ้าคลิกครั้งเดียวก็จะเป็นการรอเพื่อเว้นช่วงระหว่างการทำคำสั่งต่อไป

ถ้าหากใส่ทั้ง interval ทั้ง pause ระยะเวลาที่รอก็จะบวกกันไป

และนอกจากนี้แล้ว หากต้องการให้มีการหน่วงเวลาเหมือนกันหมดไม่ว่าจะทำคำสั่งอะไรก็ให้ไปแก้ค่าแอตทริบิวต์ PAUSE ของมอดูลเอาไว้ก่อนเริ่มใช้คำสั่ง เช่นทำแบบนี้
pyautogui.PAUSE = 0.5

ทีนี้แล้วไม่ว่าจะใช้คำสั่งไหนไปก็จะถูกเว้นครึ่งวินาทีก่อนจะทำคำสั่งต่อไปเสมอ โดยไม่ต้องใส่คีย์เวิร์ด pause ตลอด

เพียงแต่ว่าหากคำสั่งไหนใส่คีย์เวิร์ด pause ลงไปก็จะเว้นระยะเวลาหยุดตามที่ใส่ลงไปนั้นแทน



การหยุดฉุกเฉิน
ระหว่างที่สั่งให้มันทำงานไปเรื่อยๆนั้นปกติโปรแกรมจะไม่สามารถหยุดเองได้จนกว่าจะสิ้นสุดการทำงาน หรือเกิดข้อผิดพลาดขึ้นกลางคัน

ในสภาวะแบบนี้ถ้าปล่อยให้มันทำไปแล้วเกิดข้อผิดพลาดขึ้นมากลางคันอาจทำให้ทุกอยากรวน เป็นอันตรายได้เหมือนกัน ดังนั้นจึงควรรู้วิธีที่จะหยุดกลางคัน

การหยุดกลางคันสามารถทำได้โดยเลื่อนเมาส์ไปยังมุมซ้ายบนสุดของหน้าจอ เท่านี้การทำงานทั้งหมดก็จะหยุด

แต่บางครั้งเราอาจไม่ต้องการ เช่นกลัวจะเผลอเลื่อนเมาส์ไปตรงนั้นระหว่างกำลังทำงานอยู่โดยไม่ได้ตั้งใจ ในกรณีแบบนั้นก็สามารถยกเลิกการใช้วิธีการหยุดฉุกเฉินนี้ได้โดยพิมพ์
pyautogui.FAILSAFE = 0
# หรือ pyautogui.FAILSAFE = False

เท่านี้ก็จะไม่มีทางหยุดการทำงานได้กลางคันแล้ว (ค่าตั้งต้นจะเป็น True)

แต่นอกจากนี้ก็ยังมีวิธีอื่นในการหยุดอยู่อีก คือไปกลับยังคอมมานด์ไลน์ที่ใช้ตอนสั่งรันโปรแกรม แล้วสั่งหยุดโปรแกรมด้วย ctrl-c ตามปกติ แบบนี้ก็ได้เช่นกัน



การบันทึกภาพหน้าจอ
pyautogui นั้นนอกจากจะใช้ควบคุมเมาส์และคีย์บอร์ดแล้วก็ยังมีคำสั่งที่เกี่ยวกับการจัดการภาพที่แสดงบนหน้าจอด้วย

นั่นเพราะการรับรู้ว่าหน้าจอขณะนั้นหน้าตาเป็นอย่างไรก็เป็นสิ่งสำคัญในการสร้างบอตเหมือนกัน เช่น เราอาจตรวจสอบสิ่งที่อยู่บนหน้าจอเพื่อใช้ตั้งเงื่อนไขว่าต้องทำยังไงต่อไป หรืออาจต้องการหาตำแหน่งภาพที่เราต้องการเพื่อจะรู้ว่าต้องกดอะไรตรงไหน

คำสั่งสำหรับบันทึกภาพหน้าจอก็คือ screenshot

ตัวอย่างการใช้
pyautogui.screenshot('ss.png')

เพียงแค่นี้ภาพก็จะถูกบันทึกอยู่ในไฟล์ชื่อ ss.png

หากต้องการแค่บางส่วนบนหน้าจอให้ใส่คีย์เวิร์ด region เพิ่มเข้าไป โดยใส่ค่าเป็นทูเพิลของตำแหน่งซึ่งมีค่า ๔ ตัว คือ (ซ้ายสุด,บนสุด,ความกว้าง,ความสูง)

เช่น
pyautogui.screenshot('ss.png',region=(0,0,100,100))
# หรือ pyautogui.screenshot('ss.png',(0,0,100,100))

แบบนี้ภาพก็จะตัดแค่ส่วนมุมบนซ้ายสุดขนาดกว้างร้อยสูงร้อย



การเอาข้อมูลสีของภาพบนหน้าจอ
หากไม่ต้องการให้เซฟภาพก็แค่ใส่คีย์เวิร์ด region ไปโดยไม่ต้องใส่อาร์กิวเมนต์ตัวแรกเป็นชื่อไฟล์ลงไป

เช่น
print(pyautogui.screenshot(region=(0,0,100,100)))

ได้
 

จะเห็นว่าผลที่ได้ออกมาเป็นออบเจ็กต์ชนิด PIL ซึ่งเป็นออบเจ็กต์ที่เก็บข้อมูลสีของจุดภาพแต่ละจุดเอาไว้ เราสามารถเอาไปเขียนโปรแกรมเพื่อจัดการอะไรๆต่อได้

วิธีการนำไปใช้อาจมีอยู่หลากหลาย แต่ในที่นี่จะใช้วิธีการแปลงเป็นอาเรย์ของ numpy เพื่อนำไปใช้

เช่น
import numpy as np
ss = pyautogui.screenshot(region=(86,32,2,3))
ss = np.array(ss)
print(ss)
print(ss.shape)

ได้
[[[219 144  58]
  [  0 102 182]]

 [[144  58   0]
  [102 182 255]]

 [[ 58   0 102]
  [182 255 255]]

 [[  0 102 182]
  [255 255 255]]]
(3, 2, 3)

พอแปลงเป็นอาเรย์แบบนี้แล้วก็จะได้อาเรย์สามมิติที่มีขนาดเป็น (ความสูง,ความกว้าง,3) โดยมิติสุดท้ายที่เพิ่มเข้ามาคือค่าสี (แดง,เขียว,น้ำเงิน) จะมี ๓ ค่าเสมอ

หรือหากต้องการภาพแค่จุดเดียวอาจใช้คำสั่ง pixel ก็ได้ โดยใส่ตำแหน่งของจุดที่ต้องการหาค่าสีลงไป เช่น
pyautogui.pixel(555,555) # ได้ (240, 240, 240)

ถ้าต้องการหาสีตำแหน่งที่เมาส์ชี้อยู่ก็อาจเขียนแบบนี้
pyautogui.pixel(*pyautogui.position()) # ได้ (219, 213, 58)

หากแค่ต้องการเทียบว่าสีของจุดนั้นๆตรงกับค่าที่ต้องการหรือไม่ก็อาจใช้คำสั่ง pixelMatchesColor
print(pyautogui.pixelMatchesColor(300,300,(248,248,248)))

จะได้ค่า Trur หรือ False ออกมา

เทียบเท่ากับการพิมพ์ว่า
print(pyautogui.pixel(300,300)==(248,248,248))



การค้นหาภาพที่ต้องการในหน้าจอ
ต่อไปเป็นตัวอย่างการประยุกต์ใช้งานเพื่อหาตำแหน่งของเป้าหมายบางอย่างบนหน้าจอให้เจอเพื่อจะทำการคลิก

สมมุติว่าเราต้องการจะกดเลือกโปรแกรมโน้ตแพ็ดบนทัสก์บาร์  ไอคอนโน้ตแพ็ดใน windows10 รูปร่างหน้าตาเป็นแบบนี้



ลองหาค่าสีของไอคอนโดยใช้ screenshot เอาค่าสีในตำแหน่งไอคอนนั้นมาเก็บค่าเอาไว้ อาจใช้แค่ไม่กี่จุด พอที่จะให้ไม่เผลอไปซ้ำกับสีที่อื่นโดยบังเอิญได้ ในที่นี้ใช้ ๕ จุดในแนวนอนบริเวณแถวกลางๆไอคอน
ssnp = np.array(pyautogui.screenshot(region=(556,776,5,1)))
print(ssnp[0])

ได้
[[157 208 219]
 [146 202 215]
 [138 198 212]
 [137 193 207]
 [210 227 232]]

จากนั้นสามารถหำตำแหน่งที่โน้ตแพ็ดตั้งอยู่ได้โดย screenshot เอาค่าสีในบริเวณแถวทัสก์บาร์ จากนั้นไล่ค้นหาสีที่ต้องการ
notepad = np.array([[157,208,219],[146,202,215],[138,198,212],[137,193,207],[210,227,232]])
ss = np.array(pyautogui.screenshot(region=(0,776,1280,1)))
for x in range(1276):
    if(np.all(ss[0,x:x+5]==notepad)):
        pyautogui.click(x,776)
        break
elseraise

เท่านี้โปรแกรมก็จะทำการค้นหาตำแหน่งไอคอนโน้ตแพ็ดบนทัสก์บาร์แล้วก็คลิกตรงนั้น แต่ถ้าหาไม่เจอก็จะขึ้น error

ในตัวอย่างนี้เรารู้ตำแหน่งในแนวตั้งอยู่แล้วจึงให้โปรแกรมแค่ไล่หาตามแนวนอน จึงง่ายและทำได้รวดเร็ว

แต่กรณีที่ไม่รู้ตำแหน่งตามแนวตั้งด้วยก็ต้องไล่หาตามแนวตั้งด้วย อาจเขียนใหม่ได้ดังนี้
notepad = np.array([[157,208,219],[146,202,215],[138,198,212],[137,193,207],[210,227,232]])
ss = np.array(pyautogui.screenshot(region=(0,0,1280,800)))
for x,y in ((x,y) for y in range(800) for x in range(1276)):
    if(np.all(ss[y,x:x+5]==notepad)):
        pyautogui.click(x,y)
        break
elseraise

แบบนี้ก็จะซับซ้อนขึ้น และระยะเวลาในการค้นหาก็จะค่อนข้างนาน กว่าจะกวาดหาจบทั้งหน้าจอ ดังนั้นหากรู้ขอบเขตว่ามันควรอยู่ตรงไหนอยู่แล้วหาแค่แถวๆนั้นจะเร็วกว่ามาก

นี่เป็นแค่ตัวอย่างการลองใช้ ยังไงก็สามารถลองไปปรับใช้ดูอีกที



การสร้างกล่องข้อความอย่างง่าย
pyautogui ยังมีคำสั่งสำหรับสร้างกล่องข้อความแบบง่ายๆขึ้นมาด้วย อาจเอาไว้ใช้ให้เด้งขึ้นมาในกรณีที่โปรแกรมมีปัญหาเพื่อเราจะได้ดูว่าจะทำยังไงต่อ หรือสำหรับหยุดพักก่อนเริ่มทำอะไรในขั้นต่อไป

คำสั่งสำหรับสร้างกล่องข้อความให้เด้งขึ้นมาอย่างง่ายสุดคือ alert เป็นหน้าต่างง่ายๆที่มีปุ่มให้กดอันเดียว

ตัวอย่างการใช้
pyautogui.alert(text='ข้อความ',title='หัวข้อ',button='ปุ่มกด')
# หรือ pyautogui.alert('ข้อความ','หัวข้อ','ปุ่มกด')

ผลที่ได้



ค่าที่ต้องใส่มี ๓ ตัวดังที่เห็นนี้ ถ้าใส่ตามลำดับแล้วจะเขียนในรูปอาร์กิวเมนต์ธรรมดาโดยไม่ต้องใส่คีย์เวิร์ดเลยก็ได้

ค่าตั้งต้นจะเป็น text='', title='', button='OK'

คำสั่งต่อมาที่ใช้ได้คือ confirm จะคล้ายกับ alert แต่จะใส่ปุ่มได้หลายอัน

ตัวอย่าง
cf = pyautogui.confirm(text='ข้อความ', title='หัวข้อ', buttons=['ปุ่ม 1','ปุ่ม 2','ปุ่ม 3'])

ผลที่ได้



พอกดปุ่มไหนไปมันก็จะคืนค่าข้อความบนปุ่มนั้นกลับออกมาด้วย สามารถนำไปใช้ในโปรแกรมต่อได้ เช่นใช้เพื่อกำหนดทางแยกให้เราตัดสินใจว่าจะทำยังไงต่อดี

ค่าตั้งต้นเป็น text='', title='', buttons=['OK', 'Cancel']



สร้างกล่องข้อความให้ป้อนข้อความ
นอกจากกล่องข้อความง่ายๆที่มีแค่ให้กดปุ่มก็ยังสามารถสร้างกล่องข้อความที่มีให้พิมพ์ข้อความอะไรได้ สามารถทำได้โดยใช้คำสั่ง prompt

ตัวอย่าง
pyautogui.prompt(text='ข้อความอธิบายด้านบน', title='หัวข้อ' , default='ข้อความตั้งต้นในกล่องที่ให้พิมพ์')

ผลที่ได้



จากนั้นถ้ากด ok จะคืนค่าข้อความที่พิมพ์กลับมา นำไปใช้ในโปรแกรมต่อ

ถ้ากด cancel ไปจะไม่มีการคืนค่ากลับมา


ค่าตั้งต้นคือว่างเปล่าไม่มีอะไรเลย text='', title='', default=''



สำหรับกรณีที่สิ่งที่ต้องการพิมพ์นั้นเป็นพวกพาสเวิร์ดก็ใช้คำสั่ง password กล่องข้อความจะไม่แสดงข้อความที่พิมพ์ไปจริงๆ

ตัวอย่าง
pyautogui.password(text='ข้อความอธิบายด้านบน', title='หัวข้อ', default='พาสเวิร์ดตั้งต้น', mask='x')

ผลที่ได้



mask ในที่นี้คือตัวกำหนดว่าพอพิมพ์ลงไปจะกลายเป็นอักษรอะไร ถ้าไม่ใส่ก็จะเป็นดอกจัน *

ค่าตั้งต้นคือ text='', title='', default='', mask='*'


อ้างอิง

11 ธันวาคม 2563

3 เครื่องมือจาก Windows ซ่อมแซมไฟล์เสีย แก้จอฟ้า BSOD

คัดจาก : https://www.extremeit.com/3-windows-tools-bsod/

หลายคนน่าจะเคยประสบปัญหาไฟล์โปรแกรมหรือ Windows เสียหาย เป็นเหตุให้เปิดโปรแกรมไม่ได้ ไปจนถึงเกิดจอฟ้า BSOD กันเลย วันนี้แอดมีเครื่องมือช่วยแก้ไขไฟล์เสียหาย 3 ชนิดจาก Windows 10 จะเป็นอย่างไรนั้น ไปดูกันเลยครับ

CHKDSK (Check Disk)

ตัวแรกสุดที่หลายคนน่าจะเคยใช้กัน นั่นคือ Check Disk จะมีคุณสมบัติในการเช็คไฟล์ที่เสียหายในแต่ละไดรฟ์ รวมถึงการเช็ค Bad sector ในฮาร์ดดิสก์และซ่อมแซมไฟล์ให้ด้วย

วิธีการเปิดใช้งานสามารถเปิดผ่าน File Explorer ได้ดังนี้

วิธีการนี้จะง่ายกว่าหน่อย ด้วยการเข้าไปใน This PC (My Computer) แล้วคลิกขวาในไดรฟ์ที่ต้องการซ่อม เช่น จะซ่อมไดรฟ์ C: ก็คลิกขวาแล้วเลือก Properties เลยครับ

ในหน้าต่าง Properties จะมีแท็บ Tools ให้กดเข้าไปดู จะพบว่ามีส่วนของ Error Checking ให้เรากดไปที่ปุ่ม Check  จากนั้นตัวโปรแกรมจะตรวจเช็คและซ่อมไฟล์เสียหายให้เลยครับ

 

SFC (System File Checker)

ในขณะที่ CHKDSK เน้นการซ่อมแซมไฟล์ใน HDD แต่ SFC จะเน้นการซ่อมแซมไฟล์ระบบของ Windows โดยเฉพาะ ซึ่งถ้าไฟล์ Windows เสียหาย ที่เจอได้บ่อยก็เป็นพวกไฟล์ DLL สูญหาย (เวลาเปิดโปรแกรม หรือใช้งานบางฟีเจอร์แล้วจะมีหน้าต่างขึ้นว่า Missing DLL) แต่ถ้าเสียหายมากจะทำให้เกิดจอฟ้าได้

วิธีการใช้งานจะต้องเข้า Command Prompt (CMD) โดยค้นหา CMD ในช่อง Search แล้วคลิกขวาเลือก Run as administrator แล้วพิมพ์ sfc /scannow ลงไปใน CMD กด Enter

SFC จะค้นหาและซ่อมแซมไฟล์ให้ เมื่อเสร็จแล้วมันจะขึ้นข้อความ 1 ใน 3 อย่าง ดังนี้

  • Windows Resource Protection did not find any integrity violations. หมายความว่า ไม่เจอไฟล์เสียหาย
  •  Windows Resource Protection found corrupt files and successfully repaired them. หมายความว่า ไฟล์ที่เสียหายได้รับการซ่อมแซมแล้ว
  • Windows Resource Protection found corrupt files but was unable to fix some of them. หมายความว่า เจอไฟล์เสียหายแต่ซ่อมไม่ได้ ถ้าขึ้นแบบอาจจะลองรัน SFC ใน Safe Mode อีกที แต่ถ้ายังขึ้นอยู่ คงต้องขยับไปใช้ DISM ครับ

 

DISM (Deployment Image Servicing and Management)

DISM คือเครื่องมือซ่อมแซมไฟล์เสียที่ดีที่สุดในนี้ แต่ผมแนะนำให้ใช้หลังจาก CHKDSK และ SFC ไม่ได้ผลแล้ว ค่อยขยับมาใช้ไม้แข็งอย่าง DISM นะครับ

ก่อนอื่นให้เปิด CMD แบบ Administrator ขึ้นมาเหมือนเดิม แล้วตามด้วยคำสั่ง Dism /Online /Cleanup-Image /CheckHealth ซึ่งอันนี้จะเป็นการเช็คหาไฟล์เสีย โดยยังไม่มีการซ่อมแซมไฟล์ จากนั้น…

– ถ้าเจอไฟล์เสียหาย ให้พิมพ์ Dism /Online /Cleanup-Image /RestoreHealth ซึ่งตัว DISM จะดาวน์โหลดไฟล์ที่ปกติมาแทนไฟล์ที่เสียหายจาก Microsoft

– ถ้ายังไม่เจอไฟล์เสียหายให้สแกนลึกลงไปอีก Dism /Online /Cleanup-Image /ScanHealth ถ้าเจอแล้วก็ค่อยใช้คำสั่ง Dism /Online /Cleanup-Image /RestoreHealth

และนี่คือ 3 เครื่องมือที่ใช้ในการซ่อมแซมไฟล์ของ Windows เริ่มจากการซ่อมไฟล์ในไดรฟ์ด้วย CHKDSK แล้วตามด้วยการซ่อมแซมไฟล์ระบบ SFC สุดท้ายคือการดาวน์โหลดไฟล์ปกติมาแทนที่ไฟล์เสียด้วย DISM เท่านี้ก็ถือว่าน่าจะเพียงพอในระดับหนึ่งแล้วล่ะ แต่ถ้ายังซ่อมแซมไม่ได้จริง ๆ ผมขอแนะนำให้ทำการติดตั้ง Windows ใหม่อีกครั้งครับ


คัดจาก : https://www.extremeit.com/3-windows-tools-bsod/