• בלוג
  • עמוד 139
  • איך לזהות לחיצות מקלדת (ואירועים אחרים) ב tkinter

איך לזהות לחיצות מקלדת (ואירועים אחרים) ב tkinter

11/02/2021

פוסט זה כולל טיפ קצר לעבודה יעילה עם Python. אם אתם רוצים ללמוד פייתון יותר לעומק אני ממליץ על קורס Python כאן באתר.
הקורס כולל עשרות שיעורי וידאו והמון תרגול מעשי וילמד אתכם Python בצורה מקצועית מההתחלה ועד הנושאים המתקדמים.

מערכת האירועים של tk יכולה להיות קצת מבלבלת בעיקר בגלל סוגי האירועים המובנית והשימוש בטקסטים כדי לתאר אירועים (ובגלל שהתיעוד של tk לא הכי נוח לקריאה). אז לטובת אלה מכם שמסתבכים ובעקבות שאלה של תלמיד, הנה כמה דוגמאות קוד לעבודה עם לחיצות מקלדת בתוכנית tk.

1. איך זה עובד

כל Widget ב tk יכול לדווח לעולם על דברים שקורים, למשל אם שינו לו את הגודל, אם הוא קיבל פוקוס, או - וזה מה שאותנו מעניין - אם לחצו על כפתור מקלדת בשטח שלו.

ה Widgets של tk ממוקמים אחד בתוך השני ולכן כשקורה אירוע כל Widget רלוונטי מקבל הזדמנות לטפל בו. אם יש לי תיבת טקסט שנמצאת בתוך פריים אז שניהם יהיו מודעים ללחיצת הכפתור ויקבלו הזדמנות לטפל באירוע.

חיבור קוד לאירועים מבוצע עם הפונקציה bind. יש bind לכל Widget וגם הפונקציה נמצאת על אוביקט ה Tk הראשי כך שאפשר במקום אחד לטפל בכל האירועים מכל ה Widgets.

2. דוגמת קוד קצרה

התוכנית הבאה היא הדרך הכי קצרה שמצאתי ב tk להקשיב ללחיצות מקלדת:

from tkinter import *

root = Tk()

def on_key_press(event):
    print("Key Press: ", event.char)

root.bind('<KeyPress>', on_key_press)
root.mainloop()

הרצת התוכנית תציג חלון חדש ריק, וכאשר חלון זה יהיה בפוקוס אז כל לחיצת מקלדת בתוך החלון תוסיף הודעה במסוף עם הכפתור שנלחץ.

3. דוגמת קוד קצת יותר ארוכה

אפשר לראות שהרעיון עובד גם אם יש לנו מספר Widgets, ושבמצב כזה כל ה Event Handlers של כל ה Widgets יופעלו. נסו את הקוד הבא:

from tkinter import *

root = Tk()
a = Label(root, text="Hello World")
a.pack()

b = Text(root)
b.pack()

def on_key_press(event):
    print("Key Press: ", event.char)


def on_text_keypress(ev):
    print("A")

root.bind('<KeyPress>', on_key_press)
b.bind('<KeyPress>', on_text_keypress)
root.mainloop()

הקוד מציג Label ומתחתיה תיבת טקסט. כל לחיצת מקלדת בתוך החלון, ולא משנה איזה Widget נמצא עכשיו בפוקוס, תגרום להפעלת הפונקציה on_key_press. בנוסף כל לחיצת מקלדת בתוך הפוקוס של תיבת הטקסט תגרום להפעלת הפונקציה on_text_keypress.