使用pygame读取控制台输入

5
有没有办法使用 pygame 从控制台获取输入,而不是必须显示一个单独的窗口来获取输入?我正在使用 pygame 跟踪键盘上按键按下的时间。
以下代码无法工作(这只是一个最简示例,它实际上并未跟踪经过的时间):
pygame.init()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            print event.key, 'pressed'

看起来没有任何pygame事件被触发。如果我添加

screen = pygame.display.set_mode((640, 480))

pygame.init()
执行后就会触发事件,但我不想处理那个可怕的窗口。

为了解释我为什么不想要窗口,我想象这个应用程序是一个命令行实用程序,所以我不能有窗口。是否有任何功能性原因阻止pygame在命令行上运行?

谢谢!

编辑:我猜测问题出在pygame.init()上,我只需要初始化键和事件模块。根据http://www.pygame.org/docs/tut/ImportInit.html,我应该能够调用pygame.key.init()pygame.event.init(),但这并没有起作用。

5个回答

2

Pygame旨在制作(图形)游戏,因此只有在显示窗口时才捕获按键。就像Ignacio在他的答案中所说的那样,从命令行读取和从另一个窗口读取是非常不同的事情。

如果您想创建一个命令行应用程序,请尝试使用curses:

http://docs.python.org/library/curses.html

不幸的是,它只适用于Linux和Mac OS X。


但是根据这个问题的回答 https://dev59.com/f1HTa4cB1Zd3GeqPVuqT,我无法检测一个键是否被按下并保持不放... - Sam Cantrell
@Sam 这不是一个单独的问题吗?你为什么需要那个呢? - Mizipzor
@mizipzor,我正在尝试设计一个程序,将从键盘输入量化为Lilypond的音符和长度。因此,我需要知道用户按下键的时间有多长,以便确定应分配哪个音符长度。 - Sam Cantrell

1
如果你使用以下代码将窗口设置得非常小:
screen = pygame.display.set_mode((1, 1))
你将无法看到它。因此,你已经点击了窗口,但你没有注意到。
当然,如果你在任何地方点击,它就会停止工作。你必须点击pygame窗口图标才能使其再次工作。

1

控制台输入通过stdin进行,而pygame没有准备处理它。由于它依赖于终端发送按键,因此无法可靠地通过stdin获取按下/释放事件。


0
尝试使用pygame.display.iconify()。这将隐藏pygame屏幕,您仍然可以检测到按键。

尝试过了,不起作用。键盘事件没有被检测到。 - ThePhi

0

如果您根本不想要任何窗口,可以使用PyHook。如果您只想要一个控制台应用程序,请使用内置的Python命令“raw_input(...)”获取用户输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接