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

按ESC键弹出菜单
资料比较少,这年头基本没有人写curses。
#!/usr/bin/env python3
from os import system
import 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 = 0
column = 0
char = []
key = 0

screen.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=0
	width = 30
	top=5
	left=3
	menuwin =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 = 0	
	while 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+1
			
		key = menuwin.getch()
		if key == curses.KEY_UP:
			if current <= 0 :
				current = 0
			else:
				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)-1
			else:
				current = current + 1
			#char = history[menuitem]
			#cliwin.clear()
			#cliwin.addstr(1,1,char)
			#print("down",line)
			#print(history[line])
		if key == 10:
			choice = current
			print(choice)
		#if key == 27:
		#	return

while 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 keys
	if 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 += 1
			column = 0
			cliwin.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 = 0
		else:
			line = line-1
		char = 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)-1
		else:
			line = line+1
		char = 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()


	
 

你可能感兴趣的:(python,shell)