读书人

python + curses 在终端下开发光标菜单

发布时间: 2012-09-10 22:20:12 作者: rapoo

python + curses 在终端上开发光标菜单

按ESC键弹出菜单
资料比较少,这年头基本没有人写curses。
#!/usr/bin/env python3from os import systemimport curses, subprocess def get_param(prompt_string):screen.clear()screen.border(0)screen.addstr(2, 2, prompt_string)screen.refresh()input = screen.getstr(10, 10, 60)return input def execute_cmd(cmd_string):system("clear")a = system(cmd_string)print("")if a == 0:  print ("Command executed correctly")else:  print ("Command terminated with error")raw_input("Press enter")print ("") blacklist=['']screen = curses.initscr()curses.noecho(); curses.cbreak()screen.keypad(1)history = []line = 0column = 0char = []key = 0screen.clear()height,width = screen.getmaxyx()#print (height,width)subwin = screen.subwin(0, width, 0, 0)subwin.box()cliwin = screen.subwin(0, width, height-3, 0)cliwin.box() def menu(screen):height=0width = 30top=5left=3menuwin =screen.subwin(height , width,top ,left )menuwin.keypad(1)menuwin.border(0)menubar = ["1 - Add a user", "2 - Restart Apache", "3 - Show disk space", "Test", "Neo", "Netkiller""4 - Exit"]menuwin.addstr(1, 1, "Please enter a number...")current = 0while 1 :menuitem = 0#print (menuitem,current )menuwin.refresh()for m in menubar:if current == menuitem:menuwin.addstr(menuitem+2, 4,m , curses.A_REVERSE)else:menuwin.addstr(menuitem+2, 4, m)menuitem=menuitem+1key = menuwin.getch()if key == curses.KEY_UP:if current <= 0 :current = 0else:current = current-1#char = history[menuitem]#cliwin.clear()#cliwin.addstr(1,1,char)#print("up",line)#print(history[line])if key == curses.KEY_DOWN:if current >= len(menubar)-1 :current = len(menubar)-1else:current = current + 1#char = history[menuitem]#cliwin.clear()#cliwin.addstr(1,1,char)#print("down",line)#print(history[line])if key == 10:choice = currentprint(choice)#if key == 27:#returnwhile key != ord('q'):screen.refresh()subwin = screen.subwin(0, width, 0, 0)subwin.box()cliwin = screen.subwin(0, width, height-3, 0)cliwin.box()key = screen.getch()#print(key)if 31<key<126:c=chr(key)char.append(c)#screen.addstr(2,2,c)cliwin.addstr(1,column+1,c)column = column+1#screen.refresh()else: pass                  # Ignore incorrect keysif key in (curses.KEY_ENTER,10):if len(char) > 1:cmd = ''.join(char)history.append(cmd)#system(cmd)subwin.clear()subwin.addstr(1,1,subprocess.getoutput(cmd))char = []line += 1column = 0cliwin.refresh()cliwin.clear()#print ("ENTER!!!")if key == curses.KEY_LEFT: curses.beep()print("left")if key == curses.KEY_RIGHT:curses.beep()print("right")if key == curses.KEY_UP:if line <= 0 :line = 0else:line = line-1char = history[line]cliwin.clear()cliwin.addstr(1,1,char)#print("up",line)#print(history[line])if key == curses.KEY_DOWN:if line !=0 or line > len(history)-1 :line = len(history)-1else:line = line+1char = history[line]cliwin.clear()cliwin.addstr(1,1,char)#print("down",line)#print(history[line])if key == curses.KEY_HOME:#subwin = screen.subwin(0, width, 0, 0)screen.addstr(1,1,'\n'.join(history))if key == curses.KEY_END:print(char)if key == 27:menu(screen)#KEY_BACKSPACE#KEY_NPAGE KEY_PPAGE    # if x == ord('1'):    #      username = get_param("Enter the username")    #      homedir = get_param("Enter the home directory, eg /home/nate")    #      groups = get_param("Enter comma-separated groups, eg adm,dialout,cdrom")    #      shell = get_param("Enter the shell, eg /bin/bash:")    #      curses.endwin()    #      execute_cmd("useradd -d " + homedir + " -g 1000 -G " + groups + " -m -s " + shell + " " + username)    # if x == ord('2'):    #      curses.endwin()    #      execute_cmd("apachectl restart")    # if x == ord('3'):    #      curses.endwin()    #      execute_cmd("df -h")##exit()#screen.refresh()screen.keypad(0)curses.echo() ; curses.nocbreak()screen.clear()curses.endwin()
?

读书人网 >perl python

热点推荐