【问题标题】:Python Curses addstr() error when keys are not pressed未按下键时Python Curses addstr() 错误
【发布时间】:2019-07-21 19:22:09
【问题描述】:

我正在使用 curses 库在 python 中为终端重新创建 this 游戏。只要没有按下某个键,stdscr.addstr() 就会返回一个错误。

这似乎是因为在这些帧期间光标不在屏幕上(在右下角),但我无法弄清楚它为什么会移动。我正在打印的画布始终是相同大小的(它完全由在呈现 Apple 或 Basket 对象时被替换的空间组成)。我尝试减小画布大小,但光标仍会移动到那个角落。我也尝试设置curses.leaveok(True),光标似乎在跟随篮筐,但我的日志证明它仍在那个角落。

使用curses的文件:

import random
import time
import curses

from apple_season.basket import Basket
from apple_season.apple import Apple
from apple_season.coords import Canvas

def main(stdscr):

    curses.curs_set(1)  # so i can see where the cursor is
    dims = [curses.COLS - 1, curses.LINES - 1]  # pylint: disable=no-member

    stdscr.nodelay(True)
    stdscr.leaveok(True)
    key=""
    stdscr.clear()

    canvas = Canvas(*dims)

    basket = Basket(canvas)

    apples = []
    i = 0

    def finished_apples():
      if len(apples) <= 100:
         return False
      else:
         for apple in apples:
            if not apple.has_fallen:
               return False
         return True

    while not finished_apples():

        if len(apples) <= 100:  # don't make more if there are already 100
            # decide whether or not to create new apple (1/100 chance per frame)
            num = random.randint(0, 100)
            if num == 25:
                apples.append(Apple(canvas))

        try:
            key = stdscr.getkey()
            stdscr.clear()

            # pick up keyboard inputs
            # quit option
            if str(key) == "q":
                break

            # right arrow
            elif str(key) == "KEY_RIGHT":
                basket.move('right')

            # left arrow
            elif str(key) == "KEY_LEFT":
                basket.move('left')

        except Exception:
            pass

        # render objects - alters canvas to display them
        for apple in apples:
            if apple.has_fallen:
                apple.render()
            else:
                if '.0' not in str(i / 2):  # check if i is even (drop every other frame)
                    apple.fall()
                    apple.render()

        basket.render()

        try:
            stdscr.addstr(canvas.display)

        except Exception:
            pass

        stdscr.refresh()
        i += 1
        time.sleep(0.01)

if __name__ == "__main__":
    curses.wrapper(main)

(上面的代码运行良好,但是当stdscr.addstr(canvas.display) 不起作用时,即没有按键时,它什么也不做)

有趣的是,当它只是篮子或苹果时,这不会发生。

查看所有代码:https://github.com/lol-cubes/Terminal-Apple-Season/tree/soErrorCode

【问题讨论】:

    标签: python python-curses


    【解决方案1】:

    我将 stdscr.clear() 放在 try 和 except 块中,这使得该代码仅在按下键时才执行,因此由于我试图一次显示多个帧而导致终端溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多