【问题标题】:Unbuffered character input for python on a windows machineWindows机器上python的无缓冲字符输入
【发布时间】:2013-03-09 14:38:58
【问题描述】:

我要做什么

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

在 C++ 中,我可以使用 conio.h 中的函数 _getch() 来执行此操作,而且非常简单。我想用 python 编写这个程序,因为它会更容易,而且用 C++ 处理时间也很困难。

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

问题

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

我读过的东西

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

我尝试了一个按照网站应该可以运行的程序。这是来自链接

Link to getch recipe

但它不起作用。

我尝试了什么:

  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() # 第二次调用返回实际键码 如果回声: msvcrt.putch(ch) 返回 ch.decode()

    a = []

    对于范围内的 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

Windows XP SP3

【问题讨论】:

  • 您能向我们展示您的 Python 代码以及您是如何使用它的吗?
  • 对不起。我在移动设备上。
  • 如果你不发布实际代码很难提供帮助
  • 好的,先生。我将在我登录机器后立即发布代码。
  • 你试过import sys而不是getchar sys.stdin.read(1)吗?

标签: python input character


【解决方案1】:

这是我用过的,似乎可以在 Windows 控制台中使用。它有点类似于 ActiveState 配方,只是它只适用于 Windows。它基于this _getwch()msdn 文档。

#### 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)。

【讨论】:

  • 在 2.6+ 中,如果你想要 Unicode,你可以使用 getwch/putwch。由于您使用的是 b'' 文字,我认为您不需要 2.5 支持。
  • @eryksun: _getwch() 返回一个wint_t,在阅读When to use getwch() instead of getch() in Windows? 后我不确定如何将其转换为Python Unicode 字符串。
  • msvcrt 中已经为您完成了,请参阅PC/msvcrtmodule.cwint_t 是可以表示 wchar_t 的任何类型,这是 Python 在 3.3 之前的版本中用于 Windows 上的 Unicode。
  • 由于 decode 在 2.x 中的默认值是 ASCII,使用 getwch 意味着您不必担心当前的代码页。 Win32 为您处理。
  • @IcyFlame:getch是一个控制台IO函数(conio);它不适用于 IDLE 和其他 GUI shell。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多