Как я уже упоминал в комментариях, основная часть проблемы - это ваша попытка использовать то, что называется модулем keyboard
, с pygame
, что обычно требует использования собственной модели обработки событий для получения входных данных от пользователя. .
Обычно это не было бы большой проблемой, но в этом случае это немного сложнее из-за трех вещей:
- В вашей текущей программе каждая функция страницы выполняет свою собственную обработку клавиатуры.
- Функции страниц имеют слишком много повторяющегося кода.
- Некоторые клавиши, которые вы хотите обнаружить, на самом деле соответствуют двум различным физическим клавишам на стандартных клавиатурах, а именно клавишам Shift и Ctrl .
Ниже показаны некоторые методы решения этих проблем. Это уменьшает повторение кода за счет того, что называется ООП ( объектно-ориентированное программирование ), что в данном случае определяется общим классом Page
, который может представлять каждую страницу, которую вы хотите отобразить вместе с методами, содержащими общий код, необходимый для их обработки.
Он имеет дело с отображением двойного ключа, отделяя их от обычных ключей, чтобы можно было обнаружить оба физических ключа, которым они соответствуют. (В этом нет необходимости, если вы ограничиваетесь указанием точной клавиши, например левой клавиши Shift (K_LSHIFT
) или правой клавиши Ctrl (K_RCTRL
) вместо KMOD_SHIFT
и KMOD_CTRL
, которые можно использовать для обозначения любой из пар - список всех констант имени ключа показан здесь в pygame
документации . Другими словами, код позволяет указать KMOD_CTRL
для обозначения любого из них , тогда как пропуск K_LCTRL
и K_RCTRL
будет означать нажатие обоих из них в требуется то же время.
Чтобы поддержать обработку событий для отображаемого в данный момент Page
, основной цикл обработки событий проверяет, нажимаются ли требуемые клавиши, вызывая метод keys_pressed()
текущей страницы, чтобы определить, являются ли требуемые клавиши. все нажимаются одновременно.
import pygame
from pygame.locals import *
import random
DISPLAY_WIDTH, DISPLAY_HEIGHT = 500, 500
BLACK = 0, 0, 0
WHITE = 255, 255, 255
# Modifier keys which which correspomd to two different keys on keyboards.
DUAL_MODIFIERS = {KMOD_SHIFT, KMOD_CTRL, KMOD_ALT, KMOD_META}
class Page:
def __init__(self, title, background, message, text_color, *keys):
""" Save everything needed to show page and detect its keys. """
self.title = title
self.background = background
self.message = message
self.text_color = text_color
# Create two lists and put each key into one or the other
# depending on whether it's a "dual modifier".
lists = (self.keys, self.dual_mods) = [], []
for key in keys:
lists[key in DUAL_MODIFIERS].append(key)
def keys_pressed(self):
""" Check whether all keys are all being pressed simultaneously. """
pressed, mods = pygame.key.get_pressed(), pygame.key.get_mods()
return (all(pressed[key] for key in self.keys) and
all((mods & dual_mod) for dual_mod in self.dual_mods))
def show(self, surface, font):
pygame.display.set_caption(self.title)
surface.fill(self.background)
img = font.render(self.message, True, self.text_color)
surface.blit(img, (100, 100))
pygame.display.flip()
def main():
pygame.init()
screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))
msg_font = pygame.font.SysFont("Arial", 30)
# Create a list of Page instances.
pages = [Page("RW Page", WHITE, "Press r and w", BLACK, K_r, K_w),
Page("YK Page", WHITE, "Press y and k", BLACK, K_y, K_k),
Page("CTSH Page", WHITE, "Press Ctrl and Shift", BLACK, KMOD_CTRL,
KMOD_SHIFT)]
current_page = random.choice(pages) # Start with random initial page.
current_page.show(screen, msg_font)
while True: # Process events until terminated.
event = pygame.event.poll()
if event.type == QUIT:
break
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE: # Keypress to quit?
break
elif current_page.keys_pressed():
# Select a different page to display.
new_page = current_page
while new_page == current_page:
new_page = random.choice(pages)
current_page = new_page
current_page.show(screen, msg_font)
pygame.quit()
# Run application.
main()
Заключительный комментарий:
Я не знаю точно, для чего предназначено ваше приложение, но думаю, что вам следует серьезно пересмотреть дизайн его человеческого интерфейса - необходимость нажимать несколько клавиш одновременно несколько неловко, и назначение разных комбинаций их для каждой страницы делает их трудными помнить из-за отсутствия согласованности (и в этом нет необходимости, тем более что он всегда делает одно и то же, просто переключаясь на другую случайную страницу).