2

我想要做什么

我正在尝试设计带有单圈计时功能的秒表。当您按“L”时,一圈完成,当您按“S”时,所有圈都完成,计时按顺序显示。

在 C++ 中,我可以使用 conio.h 中的函数 _getch() 来做到这一点,这很容易。我想用 python 编写这个程序,因为它会更容易,而且用 C++ 处理时间也很困难。

我仍然在此链接上编写了一个程序(用于立方体计时): Cube timer

问题

没有像 _getch() 这样的函数。这是一个问题,因为在一圈结束时,您不能按一个键和一个回车键,因为这会花费时间并且会刺激用户。

我读的东西

我读到了 curses 库,但可惜它没有 Windows 端口。

我尝试了一个应该根据网站运行的程序。这是来自链接

链接到 getch 食谱

但它没有用。

我尝试了什么:

  1. msvcrt.getch()
    >>> 导入 msvcrt
    >>> msvcrt.getch()
    '\xff'

我相信 FF 是 255 的十六进制等价物。

我不明白为什么会这样。

  1. readch() 正如@martineau 中所建议的那样

    导入 msvcrt

    def readch(echo=True): "在 Windows 上获取单个字符。" while msvcrt.kbhit(): # 清除键盘缓冲区 msvcrt.getch() ch = msvcrt.getch() while ch in '\x00\xe0': # 箭头或功能键前缀?msvcrt.getch() ch = msvcrt.getch() # 第二次调用返回实际键码 if echo: msvcrt.putch(ch) return ch.decode()

    一个 = []

    对于范围内的 i (10): a.append(readch())

我得到的错误:

>>> 

Traceback (most recent call last):
  File "C:/Python25/1.py", line 30, in <module>
    a.append(readch())
  File "C:/Python25/1.py", line 25, in readch
    return ch.decode()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

我需要什么帮助

类似于 _getch() 的函数或在 Windows 机器上工作的等效函数。

机器规格

Python IDLE 2.5.4 或 2.6 或 2.7

视窗 XP SP3

4

3 回答 3

3

这就是我使用的似乎在 Windows 控制台中工作的东西。它有点类似于 ActiveState 配方,只是它只适用于 Windows。它基于 msdn文档,用于_getwch().

#### windows only ####
import msvcrt

def readch(echo=True):
    "Get a single character on Windows."
    while msvcrt.kbhit():  # clear out keyboard buffer
        msvcrt.getwch()
    ch = msvcrt.getwch()
    if ch in u'\x00\xe0':  # arrow or function key prefix?
        ch = msvcrt.getwch()  # second call returns the actual key code
    if echo:
        msvcrt.putwch(ch)
    return ch

def pause(prompt='Press any key to continue . . .'):
    if prompt:
        print prompt,
    readch(echo=False)

(更新为处理 Unicode)。

于 2013-03-09T17:41:48.603 回答
0

如果您询问如何在没有输入的情况下读取输入,您可能正在寻找绑定,我相信这需要一个 Tkinter 窗口。

lapEnded = bind_all("<KeyPress-l>", endLap)
stopRunning = bind_all("<KeyPress-s", noMoreRunning)

然后,您定义函数endLapnoMoreRunning,它们执行它们的功能。根据您的 Tkinter 和/或 Python 版本,bind_all可能只是bind. 希望这能回答你的问题。

于 2013-03-09T15:13:37.267 回答
0

您不能在 IDLE 中使用 msvcrt 库。在 Windows 命令行中尝试您的代码。

于 2022-02-07T10:44:11.337 回答