2015-08-08 60 views
0

我試圖進入使用Python的Curses,我對這兩個主題都相當陌生。我試圖製作一個可滾動的菜單對象,目前爲止它看起來像樣,但是我遇到的問題是在滾動某些測試數據時,窗口邊框消失。我已經嘗試了window.clear()和window.refresh()遍及代碼中的幾個點,但是我沒有做任何事情使得邊界持久化。爲什麼Python中的Curses邊框消失了?

#!/usr/bin/python 

import curses 
import curses.panel 

class CursesMenu(): 

    pos = 0 
    c = None 
    menuItems = None 
    selection = None 
    dimensions = None 
    MAX_DISPLAYED = 5 
    displayList = list(range(MAX_DISPLAYED)) 
    subwin_key_up = None 
    subwin_key_down = None 

    def __init__(self, menuItems=None): 
     self.menuItems = menuItems 
     curses.wrapper(self.main_menu, menuItems) 

    def scrollDisplayUp(self): #shift each element of displayList down one 
     for i in range(len(self.displayList)): 
      self.displayList[i] -= 1 

    def scrollDisplayDown(self): #shift each element of displayList up one 
     for i in range(len(self.displayList)): 
      self.displayList[i] += 1 

    def posUp(self, win): # Lower pos = higher placement 
     if self.pos == 0: #loop back around 
      self.pos = len(self.menuItems) - 1 
      self.displayList = list(range(len(self.menuItems) - self.MAX_DISPLAYED, len(self.menuItems))) 
      win.clear() 
     else: 
      self.pos -= 1 

    def posDown(self, win): # Higher pos = lower placement 
     if self.pos >= len(self.menuItems) - 1: #loop back around 
      self.pos = 0 
      self.displayList = list(range(self.MAX_DISPLAYED)) 
      win.clear() 
     else: 
      self.pos += 1 

    def main_menu(self, win, menuItems=None): 
     self.dimensions = win.getmaxyx() 
     curses.curs_set(0) #invisible cursor 
     curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) 
     highlighted = curses.color_pair(1) 
     normal = curses.A_NORMAL 

     sub = win.subwin(self.MAX_DISPLAYED + 2, 20, 1, 1) 
     sub.immedok(True) #jet fuel can't melt steel beams 
     sub.box() 

     while self.c != ord('\n'): #run until 'enter' gets pressed 
      sub.box() 
      self.dimensions = win.getmaxyx() 

      if self.c == curses.KEY_UP: 
       self.posUp(sub) 
       if self.pos <= self.displayList[0] - 1: 
        self.scrollDisplayUp() 
        sub.clear() 
        sub.refresh() 
      if self.c == curses.KEY_DOWN: 
       self.posDown(sub) 
       if self.pos >= self.displayList[-1] + 1: 
        self.scrollDisplayDown() 
        sub.clear() 
        sub.refresh() 

      for i, j in zip(self.displayList, range(self.MAX_DISPLAYED)): 
       if i != self.pos: 
        sub.addstr(j+1, 1, menuItems[i], normal) 
       else: 
        sub.addstr(j+1, 1, menuItems[i], highlighted) 

      self.c = win.getch() 
     self.selection = menuItems[self.pos] 

這裏是我用來測試它一個微小的腳本:

#!/usr/bin/python 

import cursesmenu 

menulist=['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', \ 
'India', 'Juliett', 'Kilo', 'Lima', 'Mike', 'November', 'Oscar', 'Papa', 'Quebec', \ 
'Romeo', 'Sierra', 'Tango', 'Uniform', 'Victor', 'Whiskey', 'Xray', 'Yankee', 'Zulu'] 

m = cursesmenu.CursesMenu(menulist) 
print m.selection 
print m.dimensions 
+0

嘗試在main_menu()循環中運行時沒有 - 'sub.clear()' - 。 –

+0

謝謝阿南德,解決了消失的邊界,但後來我發現陳舊的文字一直在附近。我通過在sub.clear()後面加上sub.border(0)和sub.refresh()來解決問題。 –

+0

你應該把它作爲答案並接受它,會對別人有幫助。 –

回答

-3

謝謝阿南德,那解決了消失的邊界,但後來我發現陳舊的文字是粘在一起。我通過在sub.clear()後面加上sub.border(0)和sub.refresh()來解決問題。

0

有通過讀劇本看到至少有兩個問題:

  • sub就是盒子畫出來了,它是win的孩子。您正在從win讀取數據,該數據爲refresh(覆蓋sub)。請參閱manual page
  • 有幾個地方,你清除sub,這也將刪除該框。