2

私がやろうとしていること

ラップタイミングでストップウォッチを設計しようとしています。「L」を押すとラップが完了し、「S」を押すとすべてのラップが完了し、タイミングが順番に表示されます。

C++ では、conio.h の関数 _getch() を使用してこれを行うことができ、非常に簡単です。このプログラムはPythonで書きたいと思っています.

それでも、このリンクでプログラム(キューブのタイミング用)を作成しました: Cube timer

問題

_getch() のような関数はありません。これは問題です。ラップの最後にキーとエンター キーを押すことができないためです。時間がかかり、ユーザーにとってイライラするからです。

私が読んだもの

curses ライブラリについて読みましたが、残念ながら Windows ポートがありません。

ウェブサイトに従って動作するはずのプログラムを試しました。リンクからでした

getch レシピへのリンク

しかし、うまくいきませんでした。

私が試したこと:

  1. msvcrt.getch()
    >>> msvcrt をインポート
    >>> msvcrt.getch()
    '\xff'

FF は 255 に相当する 16 進数だと思います。

なぜこれが起こっているのか理解できませんでした。

  1. readch() @martineauで提案されているように

    msvcrt をインポート

    def readch(echo=True): "Windows で 1 文字を取得します。" while msvcrt.kbhit(): # キーボード バッファをクリアする msvcrt.getch() ch = msvcrt.getch() while ch in '\x00\xe0': # 矢印またはファンクション キーのプレフィックス? msvcrt.getch() ch = msvcrt.getch() # echo の場合、2 番目の呼び出しで実際のキー コードが返されます: msvcrt.putch(ch) return ch.decode()

    a = []

    for i in range(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

4

3 に答える 3

3

これは私が使用したもので、Windows コンソールで動作するようです。これは、Windows でのみ機能することを除いて、その ActiveState レシピに多少似ています。これは、この 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)

次に、それぞれの機能を実行する関数endLapおよびを定義しnoMoreRunningます。Tkinter や Python のバージョンによっては、bind_all単にbind. これがあなたの質問に答えることを願っています。

于 2013-03-09T15:13:37.267 に答える
0

IDLE では msvcrt ライブラリを使用できません。Windows コマンド ラインでコードを試してください。

于 2022-02-07T10:44:11.337 に答える