不同功能的页面不同

时间:2018-11-04 01:09:06

标签: python pygame

我试图让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 :(得分:0)

正如我在评论中提到的那样,问题的主要部分是您尝试将名为keyboard的模块与pygame一起使用,这通常需要您使用其自己的事件处理模型来获取用户输入。

通常这不是一个太大的问题,但是在这种情况下,由于三件事,它会变得有点困难:

  1. 在当前程序中,您让每个页面功能都执行自己的键盘操作。
  2. 页面功能的重复代码太多。
  3. 您要检测的某些键实际上对应于标准键盘上的两个不同的物理键,即 Shift Ctrl 键。

下面显示了解决这些问题的一些方法。它通过所谓的OOP(object oriented programming)减少了代码重复,在这种情况下,它是通过定义通用的Page类来表示您要显示的每个页面以及包含通用方法的处理它们所需的代码。

它通过将双键映射与常规键分开来处理双键映射,以便可以检测到它们对应的两个物理键。 (如果您限制自己指定确切的键,例如左 Shift 键(K_LSHIFT)或右 Ctrl 键( K_RCTRL),而不是KMOD_SHIFTKMOD_CTRL,它们可以用来指定任何一对-here在{{1 }} documentation。)换句话说,该代码使得可以指定pygame来表示其中的任一,而传递KMOD_CTRL和{{1 }}表示需要同时按下两者

为支持对当前显示的K_LCTRL进行事件处理,主事件处理循环通过调用当前页面的K_RCTRL方法来确定是否按下了所需键,以检查是否按下了所需键。 (s)全部被同时按下。

Page

结束语:

我不确定您的应用程序的确切用途,但是您应该认真考虑其人机界面的设计-需要同时按下多个键有些尴尬,并且将不同的组合键分配给每个页面会使它们很难使用由于缺乏一致性而需要记住(并且不必要,尤其是因为它总是执行切换到不同随机页面的相同操作)。