Разная страница из разных функций - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь заставить Pygame отображать разные страницы, основываясь на функциях, вызываемых случайным образом. В идеале, когда нажимаются правые кнопки, он автоматически переходит на следующую страницу. При запуске этого окна Pygame просто перестает отвечать. Любое понимание будет оценено.

Запуск на Python 3x и pygame 1.9.5

import pygame
from pygame.locals import *
import random
import keyboard

pygame.init()

display_width = 500
display_height = 500

black = (0,0,0)
white = (255,255,255)

gd = pygame.display.set_mode((display_width,display_height))

myfont = pygame.font.SysFont("Arial", 30)

def rw():
    gd.fill(white)
    letter = myfont.render("Press r and w",0,(black))
    gd.blit(letter,(100,100))
    pygame.display.flip()
    while True:
        try: 
            if keyboard.is_pressed('r+w'): 
                break
            else:
                pass
        except:
            break

def yk():
    gd.fill(white)
    letter = myfont.render("Press y and k",0,(black))
    gd.blit(letter,(100,100))
    pygame.display.flip()
    while True:
        try: 
            if keyboard.is_pressed('y+k'): 
                break
            else:
                pass
        except:
            break

def ctsh():
    gd.fill(white)
    letter = myfont.render("Press CTRL and Shift",0,(black))
    gd.blit(letter,(100,100))
    pygame.display.flip()
    while True:
        try: 
            if keyboard.is_pressed('ctrl+shift'): 
                break
            else:
                pass
        except:
            break

my_sample = random.sample(range(3), 3)

for i in my_sample:
    if my_sample[i] == 0:
        rw()

    if my_sample[i] == 1:
        yk()

    if my_sample[i] == 2:
        ctsh()

while True:
for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
        quit()

pygame.display.update()

1 Ответ

0 голосов
/ 05 ноября 2018

Как я уже упоминал в комментариях, основная часть проблемы - это ваша попытка использовать то, что называется модулем keyboard, с pygame, что обычно требует использования собственной модели обработки событий для получения входных данных от пользователя. .

Обычно это не было бы большой проблемой, но в этом случае это немного сложнее из-за трех вещей:

  1. В вашей текущей программе каждая функция страницы выполняет свою собственную обработку клавиатуры.
  2. Функции страниц имеют слишком много повторяющегося кода.
  3. Некоторые клавиши, которые вы хотите обнаружить, на самом деле соответствуют двум различным физическим клавишам на стандартных клавиатурах, а именно клавишам 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()

Заключительный комментарий:

Я не знаю точно, для чего предназначено ваше приложение, но думаю, что вам следует серьезно пересмотреть дизайн его человеческого интерфейса - необходимость нажимать несколько клавиш одновременно несколько неловко, и назначение разных комбинаций их для каждой страницы делает их трудными помнить из-за отсутствия согласованности (и в этом нет необходимости, тем более что он всегда делает одно и то же, просто переключаясь на другую случайную страницу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...