目前,我只知道使用ncurses库显示字符串的一种方法,如下所示:
import curses
stdscr = curses.initscr()
stdscr.addch(0,0,'x')
stdscr.getch()
但是当我想要使字符串的功能下降时,我遇到了一个问题。
import curses
import time
stdscr = curses.initscr()
y=1
def fall():
global y
stdscr.addstr(y,0,'x')
stdscr.move(y-1,0)
stdscr.clrtoeol()
y += 1
stdscr.getch()
while True:
time.sleep(0.2)
fall()
如果删除此getch()
功能,则无法看到 ncurses 屏幕。但是,如果我把它放入。我必须触摸键盘上的一些键,然后弦就会掉下来。
有没有一种方法可以让字符串在没有按键盘或鼠标的情况下自动下降?
答案 0 :(得分:2)
在想要反映屏幕更改的位置刷新。 我没有纠正,但在前一个答案中修改my draw square code,在我自己的代码下使用curses库(添加注释,以便它可以对新人有用):
from curses import *
import random, time
def main(stdscr):
start_color() # call after initscr(), to use color, not needed with wrapper
stdscr.clear() # clear above line.
stdscr.addstr(1, 3, "Fig: RAINING", A_UNDERLINE|A_BOLD)
# init some color pairs:
init_pair(10, COLOR_WHITE, COLOR_WHITE) # BG color
init_pair(1, COLOR_RED, COLOR_WHITE)
init_pair(2, COLOR_BLUE, COLOR_WHITE)
init_pair(3, COLOR_YELLOW, COLOR_WHITE)
init_pair(4, COLOR_MAGENTA, COLOR_WHITE)
init_pair(5, COLOR_CYAN, COLOR_WHITE)
# First draw a white square as 'background'
bg = ' ' # background is blank
for x in range(3, 3 + 75): # horizontal c: x-axis
for y in range(4, 4 + 20): # vertical r: y-axis
stdscr.addstr(y, x, bg, color_pair(10))
stdscr.refresh() # refresh screen to reflect
stdscr.addstr(28, 0, 'Press Key to exit: ')
# Raining
drop = '#' # drop is #
while True: # runs infinitely
xl = random.sample(range(3, 3+75), 25) # generate 25 random x-positions
for y in range(5, 4 + 20): # vertical
for x in xl:
stdscr.addstr(y-1, x, bg, color_pair(10)) #clear drops @previous row
stdscr.addstr(y, x, drop, color_pair(random.randint(1, 5)))
stdscr.refresh() # refresh each time, # ^^ add drops at next row
time.sleep(0.5) #sleep for moving..
for x in xl: # clear last row, make blank
stdscr.addstr(23, x, ' ', color_pair(10))
stdscr.getkey() # it doesn't work in this code
wrapper(main) #Initialize curses and call another callable object, func,
Snap-sort of one iteration:
答案 1 :(得分:1)
您必须明确更新屏幕,方法是调用窗口上的refresh()
方法(示例中为stdscr
)或致电curses.doupdate()
。
这是因为curses
是在几年前编写的,当终端非常慢而且有效地进行修改非常重要。通过显式更新,您可以首先更改屏幕的方式,然后在单个操作中更新它,而不是对每个操作进行更新。