我试图让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()
答案 0 :(得分:0)
正如我在评论中提到的那样,问题的主要部分是您尝试将名为keyboard
的模块与pygame
一起使用,这通常需要您使用其自己的事件处理模型来获取用户输入。
通常这不是一个太大的问题,但是在这种情况下,由于三件事,它会变得有点困难:
下面显示了解决这些问题的一些方法。它通过所谓的OOP(object oriented programming)减少了代码重复,在这种情况下,它是通过定义通用的Page
类来表示您要显示的每个页面以及包含通用方法的处理它们所需的代码。
它通过将双键映射与常规键分开来处理双键映射,以便可以检测到它们对应的两个物理键。 (如果您限制自己指定确切的键,例如左 Shift 键(K_LSHIFT
)或右 Ctrl 键( K_RCTRL
),而不是KMOD_SHIFT
和KMOD_CTRL
,它们可以用来指定任何一对-here在{{1 }} documentation。)换句话说,该代码使得可以指定pygame
来表示其中的任一,而传递KMOD_CTRL
和{{1 }}表示需要同时按下两者。
为支持对当前显示的K_LCTRL
进行事件处理,主事件处理循环通过调用当前页面的K_RCTRL
方法来确定是否按下了所需键,以检查是否按下了所需键。 (s)全部被同时按下。
Page
结束语:
我不确定您的应用程序的确切用途,但是您应该认真考虑其人机界面的设计-需要同时按下多个键有些尴尬,并且将不同的组合键分配给每个页面会使它们很难使用由于缺乏一致性而需要记住(并且不必要,尤其是因为它总是执行切换到不同随机页面的相同操作)。