מה מפעיל סקריפט py זה שוב ושוב.
-
שלום וברכה.
הסקריפט הזה, אמור לקרוא קלט מלוח מקשים.
אני מחפש דרך לגרום לו להפסיק כאשר מתקיים תנאי מסויים.
אך אני לא מוצא בספריה את מה שקורא לו לפעול שוב ושוב.
אודה מאוד למישהו שיוכל להציץ בספריה.
תודה רבה מאוד.from pad4pi import rpi_gpio KEYPAD = [ [1,2,3,"A"], [4,5,6,"B"], [7,8,9,"C"], ["*",0,"#","D"] ] ROW_PINS = [26, 21, 20, 16] # BCM numbering COL_PINS = [6, 5, 0,12] # BCM numbering factory = rpi_gpio.KeypadFactory() # Try factory.create_4_by_3_keypad # and factory.create_4_by_4_keypad for reasonable defaults keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS) def printKey(key): print(key) # printKey will be called each time a keypad button is pressed !וזה מה שחשוב לי לשלוט עליו.תודה keypad.registerKeyPressHandler(printKey)
-
@yossiz , אסביר: כוונתי היא לנסות להבין מה גורם לַפעולה לקרות שוב ושוב.
בד"כ, כדי שפעולה תחזור ע"ע, משתמש בלולאה.
ואילו כאן שורה 28 כל הזמן פועלת בלי לולאה שוב ושוב.
וזה אני מנסה להבין איך זה עובד, מי קורא לה כל פעם מחדש.
וגם נפק"מ:- לסגור אותה. (בתחילה הוספתי בספריה בשורה 110 sys.exit() אך זה לא מוצלח)
- לקבל ערכים ממנה. עכשיו חייב להשתמש ב global כדי לקבל ערכים..)
תודה רבה.
-
אנסה להסביר בלשוני הקלושה בפייתון (אני דיי ג׳וניור בפייתון)
בשורה 17 אתה יוצר אובייקט חדש עם השם (או ׳מצביע׳ או ׳לינק׳ או ווטאבר) keypad מה שאתה מאחסן בתוכו זה אובייקט חדש שנוצר על פי הקלאס שבשורה הזו בספרייהומה שקורה בשורה 28 בקוד שלך זה רישום של handler חדש לאובייקט הזה. כלומר ביתר ביאור: לקלאס
keypad
יש בתוךself
מערך שנקראhandlers
- כאשר כל מה שנמצא שם ירוץ במקרה ו-- רגע עוד שניה.ברישום של אובייקט מקלאס
keypad
מופעלת פונקציה שממתינה ללחיצות במקלדת, כל לחיצה במקלדת עוברת לוגיקה על ידי הפונקציה. שורה 104 בספריהאם תסתכל בקוד - תראה שכחלק מהלוגיקה - הוא בודק אם
self._handlers
מכיל משהו - ואם כן הוא בעצם מריץ את מה שיש שם במערך (בלולאה, כי יכול להיות שם כמה) עם הערך של הכפתור שנלחץ. שורה 111 בספריהעד עכשיו בלבלתי את השכל, עכשיו בנוגע לשאלה שלך מה גורם לזה לרוץ כל הזמן והרי לא רואים ׳לולאה׳? זה כאן - פשוט קורא לGPIO - ספריית עזר לקריאה מהרספברי עד כמה שאני מבין - שנותנת את הפונקציה
add_event_detect
- שמאזינה לאינפוטים מסוימים. במקרה שלנו הפרמטר שמעבירים לה בין השאר הואGPIO.FALLING
שכפי שרואים כאן משמש לקליטת לחיצה (יש הבדל בין לחיצה לעזיבת הכפתור ואולי גם יש עוד סטייטים) על כפתור..
הספרייה הנ״ל מותקנת כחלק מה-setup של הספרייה pad4piאז בנוגע לשאלות שכתבת בסוף:
- לסגור אותה - אתה יכול להריץ משהו שיסיר את המאזין הזה. כמו שמתואר בסוף הדוקומנטציה כאן - אתה יכול לכתוב
GPIO.remove_event_detect(channel)
בתוךchannel
תכתוב את הערוץ שאתה רוצה להסיר. נגיד כנראה זה יעבוד -GPIO.remove_event_detect(GPIO.FALLING)
(אם כי ייתכןמאוד שלא, וצריך להגדיר אתchannel
בצורה אחרת) - לקבל ערכים ממנה - הכי פשוט שתוסיף פונקציה בתור handler שהרי ה-handlers מקבלים את הערכים שנלחצו.
הגיוני מאוד!! שבלבלתי את השכל, אז קח דבריי בערבון מוגבל
- לסגור אותה - אתה יכול להריץ משהו שיסיר את המאזין הזה. כמו שמתואר בסוף הדוקומנטציה כאן - אתה יכול לכתוב
-
@chv אמר במה מפעיל סקריפט py זה שוב ושוב.:
עכשיו בנוגע לשאלה שלך מה גורם לזה לרוץ כל הזמן והרי לא רואים ׳לולאה׳? זה כאן - פשוט קורא לGPIO
וגו'תודה רבה מאוד!. אני עדיין מנסה להבין מה קורה בזמן הריצה:
- וודאי שלא עובר על כל השורות מתחילה כל פעם.
- וודאי שלא ממתין שם [בשורה 28] כי אחרי ש
keypad.registerKeyPressHandler(printKey)
מפסיק לפעול הוא לא ממשיך את הפקודות שאחריו.
ולא כמו לולאה רגילה שהשורות הבאות לא נקראות עד לסיום הלולאה. -
@יצירה עכשיו הבנתי את השאלה שלך. באמת לא ברור מתוך הקוד איפה הלולאה.
נראה לי שהתשובה היא שספריית GPIO (שהספרייה שאתה משתמש בה משתמשת בשירותיה) יוצרת ברקע thread חדש שמריצה לולאה אינסופית שמאזינה לאירועי לחיצות ומפעילה את ה-handler. (מקור, קוד המקור שמממש את זה).
אני לא יודע מה ההתנהגות הרשמית של פייתון כאשר הסקריפט הסתיימה ויש עדיין thread שרצה ברקע. אבל נראה מכאן שהיא לא מסיימת את התהליך עד שה-thread ברקע מסתיים.
נראה מתוך הקוד שקריאה לפונקצייתcleanup
מסיימת את הלולאה האינסופית ותאפשר לתהליך להסתיים.