ورودی صفحه کلید و ماوس در پایتون و رزبری پای

اکثر پروژه ها برای کار کردن به عمل انسانی نیاز دارند. و برای ارسال دستورالعمل ها به کامپیوتر، افراد از دستگاه های جانبی مانند صفحه کلید و ماوس استفاده می کنند. در این آموزش، نحوه تشخیص ورودی صفحه کلید و موس را با استفاده از پایتون در Raspberry Pi یاد خواهیم گرفت.
ماژول های مختلفی در پایتون وجود دارند که از تشخیص ورودی صفحه کلید و ماوس پشتیبانی میکنند. از جمله ماژول های keyboard , ncurses و… متأسفانه، همه آنها مشکلاتی دارند که پیاده سازی آنها را در رزبری پای سخت می کند. به عنوان مثال، ماژول keyboard به root نیاز دارد.
من چند تا از این روش ها را امتحان کردم و بنظر من استفاده از ماژول های استاندارد sys و pygame ساده ترین کار است.
با ماژول SYS
ماژول sys توابعی را ارائه می کند که جنبه های خاصی ازمحیط برنامه پایتون را کنترل می کند. این ماژول به صورت پیشفرض در پایتون نصب است بنابراین نیازی به گفتن روش های نصب نیست.
تابع اصلی که از این ماژول استفاده می کنیم stdin است و توسط مفسر پایتون برای دسترسی به جریان ورودی استاندارد استفاده می شود. اگر با جریان ورودی استاندارد آشنایی ندارید، آن را به عنوان بخشی از یک کانال ارتباطی بین یک برنامه و محیط توسعه آن در نظر بگیرید. کل کانال از ورودی استاندارد، خروجی استاندارد و جریان های خطای استاندارد تشکیل شده است. Stdin ورودی متن را می پذیرد و تابع های Stdout و Stderr داده ها را از خروجی دریافت می کنند. یک سیستم مبتنی بر لینوکس هنگام اجرای یک دستور/برنامه بلافاصله این سه جریان را ایجاد می کند.
کد برای ورودی صفحه کلید:
import tty, sys, termios filedescriptors = termios.tcgetattr(sys.stdin) tty.setcbreak(sys.stdin) x = 0 while 1: x=sys.stdin.read(1)[0] print("You pressed", x) if x == "r": print("If condition is met") termios.tcsetattr(sys.stdin, termios.TCSADRAIN, filedescriptors)
توضیح کد:
ابتدا ماژول sys را به همراه ماژول های tty و termios فراخوانی کنید. هر دو ماژول tty و termios مورد نیاز هستند تا مطمئن شوند که ترمینال ورودی هر کاراکتر را می خواند.
بیایید خط به خط به مسائل بپردازیم.
ما از termios.tcgetattr(sys.stdin) برای بازیابی تنظیمات فعلی ترمینال در جریان stdin استفاده می کنیم.
سپس، جریان ورودی را با استفاده از tty.setcbreak(sys.stdin) تغییر می دهیم. در یک سیستم لینوکس، ورودی خط فرمان به عنوان پیشفرض روی حالت cooked تنظیم میشود. حالت cooked به شما امکان می دهد کلمات را در ترمینال وارد کنید. این باعث می شود که ترمینال قبل از پردازش ورودی منتظر یک کاراکتر خط جدید (/n) بماند. به همین دلیل است که هر چیزی که در ترمینال تایپ می کنید اجرا نمی شود مگر اینکه اینتر را فشار دهید. ما باید آن را به حالت raw تغییر دهیم تا دستورات تک کاراکتری را در خود جای دهد. ما این کار را با تابع پایتون tty.setcbreak انجام می دهیم.
به لطف tty.setcbreak، هر فشار کلید اکنون یک خروجی می دهد. مشکل بعدی ما غیرفعال کردن حالت خام زمانی است که از حلقه اصلی خارج می شود. برای انجام این کار به termios.tcsetattr نیاز داریم. از آنجایی که شامل تنظیمات اصلی درایور tty است، ما فقط باید آن را به termios.tcsetattr بگوییم تا به حالت cooked برگردد.
با استفاده از ماژول PYGAME
از طرف دیگر، ماژول pygame می تواند مفید باشد. Pygame همانطور که از نام آن پیداست، یک ماژول پایتون است که به صراحت برای ایجاد بازی ساخته شده است. این یک کتابخانه ساده است که شامل توابعی برای ترسیم گرافیک، پخش صداها و مدیریت ورودی صفحه کلید و ماوس است.
تفاوت اصلی بین sys و pygame این است که sys از CLI (واسط خط فرمان) استفاده می کند در حالی که pygame از رابط کاربری گرافیکی استفاده می کند.
به همین دلیل است که pygame می تواند ورودی ماوس را تشخیص دهد. CLI برای تنظیمات حداقلی مانند پیکربندی هدلس ایده آل است (نیازی به مانیتور کامپیوتر خارجی ندارد). پیکربندی هدلس فقط هنگام اشکال زدایی یا افزودن یک ویژگی به طور موقت از صفحه کلید استفاده می کند. اکثر CLI نمی توانند حرکات ماوس را تشخیص دهند.
از طرف دیگر، یک مانیتور خارجی برای کارکرد pygame ضروری است. بدون آن، نمی توانید ورودی صفحه کلید و ماوس یا هر چیز دیگری را داشته باشید.
کد برای ورودی صفحه کلید با KEY DOWN
import pygame pygame.init() window = pygame.display.set_mode((300, 300)) pygame.display.set_caption("Pygame Demonstration") mainloop=True while mainloop: for event in pygame.event.get(): if event.type == pygame.QUIT: mainloop = False if event.type == pygame.KEYDOWN: print(pygame.key.name(event.key)) if event.key == pygame.K_r: print('If condition is met') pygame.quit()
سه خط اول علاوه فراخوانی ماژول pygame موارد مورد نیاز را نیز مقدار دهی میکند، یعنی ابعاد پنجره را تنظیم میکنید نامگذاری پنجره را هم انجام میدهد. حلقه اصلی منتظر می ماند تا یک رویداد اتفاق بیفتد و بررسی می کند که آیا یک رویداد pygame.KEYDOWN است یا خیر. KEYDOWN به این معنی است که یک دکمه صفحه کلید فشار داده شده است. اگر یک رویداد KEYDOWN رخ داده باشد، کلید را چاپ میکند و بررسی میکند که آیا حرف r است یا خیر. اگر r باشد، “If condition is met” را نشان می دهد. pygame.QUIT به برنامه می گوید که با فشار دادن دکمه بستن خارج شود. اگر فراموش کنید pygame.QUIT را اضافه کنید، پنجره Pygame شما بسته نخواهد شد حتی اگر X را چندین بار فشار دهید.
کد برای ورودی صفحه کلید با استفاده از GET_PRESSED
import pygame pygame.init() window = pygame.display.set_mode((300,300)) pygame.display.set_caption("Pygame Demonstration") mainloop=True while mainloop: pygame.time.delay(100) for event in pygame.event.get(): if event.type==pygame.QUIT: mainloop=False pressed = pygame.key.get_pressed() buttons = [pygame.key.name(k) for k,v in enumerate(pressed) if v] print(buttons) # print list to console if pressed[pygame.K_r]: print("If condition is met") pygame.quit()
راه دیگر برای تشخیص فشار دادن یک کلید، استفاده از تابع get_pressed() است. تفاوت اصلی بین این و روش قبلی این است که get_pressed() وضعیت هر دکمه صفحه کلید را هر بار که فراخوانی می شود، برمی گرداند. به همین دلیل است که نمیتوانیم از pygame.key.name برای شناسایی کلید استفاده کنیم. برای جستجوی دکمهای که پس از استفاده از تابع get_pressed() برمیگردد، باید از یک حلقه for استفاده کنیم.
کد برای ورودی ماوس
import pygame pygame.init() window = pygame.display.set_mode((300,300)) pygame.display.set_caption("Pygame Demonstration") mainloop=True while mainloop: pygame.time.delay(10) for event in pygame.event.get(): if event.type==pygame.QUIT: mainloop=False if event.type==pygame.MOUSEBUTTONDOWN: print("Mouse button is pressed") x,y=pygame.mouse.get_pos() print(x,y) pygame.quit()
در نهایت، برای تشخیص ورودی ماوس، از توابع pygame.mouse استفاده می کنیم. برنامه نمونه ما زمانی که کلیک ماوس را در پنجره Pygame تشخیص می دهد، “Mouse button is pressed” را روی ترمینال نمایش می دهد. همچنین مکان کلیک را در مختصات x و y نشان می دهد.
امیدواریم این آموزش به شما در درک نحوه استفاده از رزبری پای برای تشخیص ورودی های صفحه کلید و ماوس کمک کرده باشد! اگر در مورد هر چیزی سوالی دارید در قسمت نظرات اعلام کنید.