设为首页 收藏本站
查看: 662|回复: 0

[经验分享] python + curses 在终端上开发光标菜单

[复制链接]

尚未签到

发表于 2017-5-7 11:16:40 | 显示全部楼层 |阅读模式
  


按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()


 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374135-1-1.html 上篇帖子: python的html解析鲁棒性不够 下篇帖子: 用 Eclipse 和 Ant 进行 Python 开发
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表