python 在诅咒中使用垫的动画

rks48beu  于 2022-12-02  发布在  Python
关注(0)|答案(1)|浏览(98)

我想在屏幕上移动一个curses pad,但是我找不到一种方法,可以在不删除pad内容的情况下,自动删除屏幕上先前位置的pad。我不想每次移动pad时都要重新绘制它。下面是我的测试程序:

import curses
import time

def main(stdscr):
  pad = curses.newpad(10, 10)
  ch = ord('A')
  pad.addch(4, 4, ch)
  for y in range(0, 10):
    for x in range(0, 10):
      print("adding pad at {y},{x}")
      try:
        pad.insch(y, x, ch)
      except:
        pass
      if x % 9 == 0:
        ch += 1
  pad.refresh(0, 0, 0, 0, 10, 10)
  time.sleep(2)
  pad.refresh(0, 0, 1, 1, 11, 11)
  time.sleep(2)
  pad.refresh(0, 0, 2, 2, 12, 12)
  time.sleep(2)

curses.wrapper(main)

在此脚本结束时,窗口如下所示:

AAAAAAAAAA
BAAAAAAAAAA
CBAAAAAAAAAA
DCBBBBBBBBBB
EDCCCCCCCCCC
FEDDDDDDDDDD
GFEEEEEEEEEE
HGFFFFFFFFFF
IHGGGGGGGGGG
JIHHHHHHHHHH
 JIIIIIIIIII
  JJJJJJJJJJ

前两行和每一行的前两个字符是从以前的垫显示剩余。我希望这些擦除。
我可以创建一个具有相同尺寸的不同凸台,并使用它从屏幕中删除块:

def main(stdscr):
  pad = curses.newpad(10, 10)
  erasepad = curses.newpad(10, 10)
  ch = ord('A')
  pad.addch(4, 4, ch)
  for y in range(0, 10):
    for x in range(0, 10):
      print("adding pad at {y},{x}")
      try:
        pad.insch(y, x, ch)
      except:
        pass
      if x % 9 == 0:
        ch += 1
  pad.refresh(0, 0, 0, 0, 10, 10)
  time.sleep(2)
  erasepad.refresh(0, 0, 0, 0, 10, 10)
  pad.refresh(0, 0, 1, 1, 11, 11)
  time.sleep(2)
  erasepad.refresh(0, 0, 1, 1, 11, 11)
  pad.refresh(0, 0, 2, 2, 12, 12)
  time.sleep(2)

这对我的应用程序是可行的,但是有没有更有效的方法呢?这需要我为每个动画块创建两个pad,并且每次都要完全擦除每个pad。

pkwftd7m

pkwftd7m1#

大致就是这样。但是示例代码效率很低,需要进行额外的重新绘制。看一下**noutrefreshdoupdate(替换那些刷新调用),并将time.sleep替换为napms**(同样,为了提高性能)。

相关问题