Събития на клавиатурата¶
От генерираните от клавиатурата събития най-важно е събитието за натискане на клавиши, така че ние ще се съсредоточим върху това най-много. При натискане на клавиши на клавиатурата, в обекта събитие, който представлява събитие в нашите програми, стойността на event.type ще бъде pg.KEYDOWN
.
Когато натискането на клавишен клавиш е регистрирано, почти винаги искаме да знаем кой клавиш е. Това можем да разберем, като тестваме стойността на event.key
. Както вече споменахме в урока за четене на състоянието на клавиатурата, че за всеки клавиш има константа, съответстваща на този клавиш. Нека си припомним имената на тези константи за някои често тествани ключове (можете да видите пълен списък на тези константи тук ):
constant |
key |
---|---|
pg.K_LEFT |
лява стрелка |
pg.K_RIGHT |
дясна стрелка |
pg.K_UP |
стрелка нагоре |
pg.K_DOWN |
стрелка надолу |
pg.K_SPACE |
разстояние |
pg.K_a |
клавиш a |
pg.K_b |
клавиш b |
pg.K_c |
клавиш c |
Стойността на полето event.key ни казва кой физически клавиш е натиснат и тази стойност е подходяща за клавиши като клавиши със стрелки, Ctrl, Shift, Alt, Home, End и т.н. Що се отнася до текст, може да е по-удобно да се използва стойността на полето “event.unicode”, което съдържа символа, който току-що беше въведен (като един символен низ).
Следващият пример илюстрира тестване на натискане на клавиш или събитие pg.KEYDOWN.
Пример - кръстословица
В този пример потребителят може да използва клавишите със стрелки на клавиатурата, за да премества рамката и да въвежда букви в полета.
Обърнете внимание на функцията handle_event, в която се извършва проверка на типа събитие, и след това, ако е натискане на клавиш, се проверява допълнителна информация за събитието, съхранявана в полетата event.key и event.unicode.
Освен това можете да опитате да съберете няколко интересни кръстословици.
Нека сравним тази програма с програмата „Навигация“ от урока за четене на състоянието на клавиатурата:
В програмата „Навигация“ |
В програмата „кръстословица“ |
---|---|
жълтият кръг се движеше с един пиксел - плъзгайки се |
рамката се движи с едно поле - скача |
нямахме точен контрол на това къде ще спре кръга |
можем точно да контролираме къде ще спре рамката |
няма значение къде точно ще спре кръга |
има значение къде точно ще спре рамката |
четем състоянието на клавишите(надолу или нагоре) |
използваме събитие (натискане на клавиш) |
Задача - навигация през полета
Напишете програма, която работи както е показано в примера (бутон „Play Task“).
Потребителят може да използва клавишите със стрелки на клавиатурата, за да ръководи символа, представен с жълт кръг. Героят се движи из полетата с бели точки.
Задача - създаване на лабиринт
Напишете програма, която прави лабиринт. Червената рамка трябва да се контролира с помощта на стрелките, а натискането на интервала трябва да промени цвета на квадрат (от черно до бяло и обратно).
Когато приключите със задачата, опитайте следното:
кликнете върху бутона „Play Task“ (този път примерната програма прави повече от това, което поискахме от вас)
направете лабиринта по желания от вас начин
натиснете S за старт и гледайте
натиснете P, за да включите и изключите режима на пауза, тоест да спрете или възобновите търсенето
Бонус - програма за практика на машинопис¶
Програмата по-долу е предназначена за въвеждане на практика. Програмата е дълга, но трябва да можете да разберете голяма част от нея.
Може да искате (не е задължително) да приспособите програмата към вашите нужди, особено в началото. Например:
да забави (или по-късно да ускори) падането на буквите
да не губите точки, когато направите грешка
когато овладеете буквите, които попадат първи, да ги премахнете от списъка с букви, които да практикувате
да промените набора от падащи символи само на числа и знаци за работа (ако искате да практикувате да пишете само на цифровата клавиатура от дясната страна)
за натискане на интервала изтрийте най-малката буква (с малко намаляване на резултата)
или нещо друго, за което се сещате.
Когато имате време, вие се насърчавате да се опитате да получите максимално висока оценка (без мамене).