我想在屏幕上移动一个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。
1条答案
按热度按时间pkwftd7m1#
大致就是这样。但是示例代码效率很低,需要进行额外的重新绘制。看一下**
noutrefresh
和doupdate
(替换那些刷新调用),并将time.sleep
替换为napms
**(同样,为了提高性能)。