我試圖進入使用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
嘗試在main_menu()循環中運行時沒有 - 'sub.clear()' - 。 –
謝謝阿南德,解決了消失的邊界,但後來我發現陳舊的文字一直在附近。我通過在sub.clear()後面加上sub.border(0)和sub.refresh()來解決問題。 –
你應該把它作爲答案並接受它,會對別人有幫助。 –