2

以下のコードでは、「.」を配置する矢印キーを使用して、画面上の小さなグリッドを歩き回ることができます。あなたが探検したり、隣にいた場所。最初の getch (キーストロークを取得するため) の前に更新を行ったにもかかわらず、開始位置から移動するまで、画面には最初は何も表示されません。addstr に続いて refresh がすぐに表示され、その後 getch が待機するべきではありませんか? stdscr.refresh() を追加しようとしましたが、それも役に立ちませんでした。最初のキーストロークを待つ直前に画面をリフレッシュするにはどうすればよいですか?

import curses

def start(stdscr):
    curses.curs_set(0)
    movement = curses.newpad(10, 10)

    cur_x, cur_y = 5, 5

    while True:
        movement.addstr(cur_y, cur_x, '@')
        for (x_off, y_off) in [(-1,0),(1,0),(0,-1),(0,1)]:
            movement.addstr(cur_y + y_off, cur_x + x_off, '.')
        movement.refresh(1, 1, 0, 0, 7, 7) #Nothing is displayed until after the first key-stroke

        key_stroke = stdscr.getch()
        move_attempt = False
        if 0 < key_stroke < 256:
            key_stroke = chr(key_stroke)
        elif key_stroke == curses.KEY_UP and cur_y > 1:
            cur_y -= 1
        elif key_stroke == curses.KEY_DOWN and cur_y < 8:
            cur_y += 1
        elif key_stroke == curses.KEY_LEFT and cur_x > 1:
            cur_x -= 1
        elif key_stroke == curses.KEY_RIGHT and cur_x < 8:
            cur_x += 1
        else:
            pass

if __name__ == '__main__':
    curses.wrapper(start)
4

4 に答える 4

2

問題を解決するには、stdscr.refresh()の前に時間を追加してください。movement.refresh()

refreshステートメントの後に追加することtime.sleep(1)で、画面に書き込みますが、呼び出されると消えますが、それstdscr.getch()は初めてです。おそらく、stdscr の初期化の遅延に関係している可能性があります。

stdscr.refresh()の後に呼び出しmovement.refresh()ても同じ効果があります。ループを最初に通過するstdscr.refresh()と画面がクリアされますが、その後のループではクリアされません。プログラムの早い段階で呼び出すことによりstdscr.refresh()、この奇妙な初回の更新が邪魔にならなくなります。

于 2013-05-27T02:02:52.670 に答える
0

パッドを使用する場合、何らかの理由で (理由はわかりません) curses.doupdate、パッドの を呼び出した後に呼び出す必要がありますrefresh

于 2013-05-26T22:30:51.020 に答える