2014-02-10 28 views
1

目前,我知道只有一種方式使用ncurses庫,就像下面顯示的字符串:我可以在沒有getch()函數的情況下在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的屏幕。但如果我把它放進去,我必須觸摸鍵盤上的某個鍵,然後弦纔會掉下來。

有沒有一種方法可以讓字符串自動落下而不用敲擊鍵盤或鼠標?

回答

1

你必須明確更新屏幕上,通過調用該窗口上refresh()方法(stdscr在你的例子),或致電curses.doupdate()

這是由於這樣的事實:curses是幾年前寫的,當終端,其中相當緩慢,並有效地進行修改,這是非常重要的。通過明確的更新,您可以首先更改屏幕的方式,然後在單個操作中對其進行更新,而不是對每個操作進行更新。

+0

刷新幫助,謝謝。 – Mario

2

刷新您想要反映屏幕更改的點。 我不整頓,但在前面的回答修改my draw square code,下面我自己使用的代碼詛咒庫(添加註釋,以便它可以成爲一個新的人有用):

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, 

管理單元排序的一個迭代:

rain

兩個迭代:http://s1.postimg.org/ehnvucp1p/rain.gif

+0

使用[創建gif工具](http://gifmaker.me/) –

相關問題