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

Netkiller代码  

  1. 按ESC键弹出菜单  

Netkiller代码  

  1. 资料比较少,这年头基本没有人写curses。  

Netkiller代码  

  1. #!/usr/bin/env python3  
  2. from os import system  
  3. import curses, subprocess  
  4.    
  5. def get_param(prompt_string):  
  6.     screen.clear()  
  7.     screen.border(0)  
  8.     screen.addstr(2, 2, prompt_string)  
  9.     screen.refresh()  
  10.     input = screen.getstr(10, 10, 60)  
  11.     return input  
  12.    
  13. def execute_cmd(cmd_string):  
  14.     system("clear")  
  15.     a = system(cmd_string)  
  16.     print("")  
  17.     if a == 0:  
  18.       print ("Command executed correctly")  
  19.     else:  
  20.       print ("Command terminated with error")  
  21.     raw_input("Press enter")  
  22.     print ("")  
  23.    
  24. blacklist=['']  
  25.   
  26. screen = curses.initscr()  
  27. curses.noecho();   
  28. curses.cbreak()  
  29. screen.keypad(1)  
  30. history = []  
  31. line = 0  
  32. column = 0  
  33. char = []  
  34. key = 0  
  35.   
  36. screen.clear()  
  37. height,width = screen.getmaxyx()  
  38. #print (height,width)  
  39. subwin = screen.subwin(0, width, 0, 0)  
  40. subwin.box()  
  41. cliwin = screen.subwin(0, width, height-3, 0)  
  42. cliwin.box()  
  43.    
  44. def menu(screen):  
  45.     height=0  
  46.     width = 30  
  47.     top=5  
  48.     left=3  
  49.     menuwin =screen.subwin(height , width,top ,left )  
  50.     menuwin.keypad(1)  
  51.     menuwin.border(0)  
  52.     menubar = ["1 - Add a user", "2 - Restart Apache", "3 - Show disk space", "Test", "Neo", "Netkiller""4 - Exit"]  
  53.     menuwin.addstr(1, 1, "Please enter a number...")  
  54.       
  55.     current = 0   
  56.     while 1 :  
  57.         menuitem = 0  
  58.         #print (menuitem,current )  
  59.         menuwin.refresh()  
  60.         for m in menubar:  
  61.             if current == menuitem:  
  62.                 menuwin.addstr(menuitem+2, 4,m , curses.A_REVERSE)  
  63.             else:  
  64.                 menuwin.addstr(menuitem+2, 4, m)  
  65.             menuitem=menuitem+1  
  66.               
  67.         key = menuwin.getch()  
  68.         if key == curses.KEY_UP:  
  69.             if current <= 0 :  
  70.                 current = 0  
  71.             else:  
  72.                 current = current-1  
  73.             #char = history[menuitem]  
  74.             #cliwin.clear()  
  75.             #cliwin.addstr(1,1,char)  
  76.             #print("up",line)  
  77.             #print(history[line])  
  78.         if key == curses.KEY_DOWN:  
  79.             if current >= len(menubar)-1 :  
  80.                 current = len(menubar)-1  
  81.             else:  
  82.                 current = current + 1  
  83.             #char = history[menuitem]  
  84.             #cliwin.clear()  
  85.             #cliwin.addstr(1,1,char)  
  86.             #print("down",line)  
  87.             #print(history[line])  
  88.         if key == 10:  
  89.             choice = current  
  90.             print(choice)  
  91.         #if key == 27:  
  92.         #   return  
  93.   
  94. while key != ord('q'):  
  95.       
  96.     screen.refresh()  
  97.     subwin = screen.subwin(0, width, 0, 0)  
  98.     subwin.box()  
  99.     cliwin = screen.subwin(0, width, height-3, 0)  
  100.     cliwin.box()  
  101.       
  102.   
  103.     key = screen.getch()  
  104.       
  105.     #print(key)  
  106.       
  107.     if 31<key<126:  
  108.         c=chr(key)  
  109.         char.append(c)  
  110.         #screen.addstr(2,2,c)  
  111.         cliwin.addstr(1,column+1,c)  
  112.         column = column+1  
  113.         #screen.refresh()  
  114.     else:   
  115.         pass                  # Ignore incorrect keys  
  116.     if key in (curses.KEY_ENTER,10):  
  117.         if len(char) > 1:  
  118.             cmd = ''.join(char)  
  119.             history.append(cmd)  
  120.             #system(cmd)  
  121.             subwin.clear()  
  122.             subwin.addstr(1,1,subprocess.getoutput(cmd))  
  123.             char = []  
  124.             line += 1  
  125.             column = 0  
  126.             cliwin.refresh()  
  127.             cliwin.clear()  
  128.             #print ("ENTER!!!")  
  129.           
  130.     if key == curses.KEY_LEFT:   
  131.         curses.beep()  
  132.         print("left")  
  133.     if key == curses.KEY_RIGHT:  
  134.         curses.beep()  
  135.         print("right")  
  136.     if key == curses.KEY_UP:  
  137.         if line <= 0 :  
  138.             line = 0  
  139.         else:  
  140.             line = line-1  
  141.         char = history[line]  
  142.         cliwin.clear()  
  143.         cliwin.addstr(1,1,char)  
  144.         #print("up",line)  
  145.         #print(history[line])  
  146.     if key == curses.KEY_DOWN:  
  147.         if line !=0 or line > len(history)-1 :  
  148.             line = len(history)-1  
  149.         else:  
  150.             line = line+1  
  151.         char = history[line]  
  152.         cliwin.clear()  
  153.         cliwin.addstr(1,1,char)  
  154.         #print("down",line)  
  155.         #print(history[line])  
  156.     if key == curses.KEY_HOME:  
  157.         #subwin = screen.subwin(0, width, 0, 0)  
  158.         screen.addstr(1,1,'\n'.join(history))  
  159.   
  160.     if key == curses.KEY_END:  
  161.         print(char)  
  162.       
  163.     if key == 27:  
  164.         menu(screen)  
  165.     #KEY_BACKSPACE  
  166.     #KEY_NPAGE KEY_PPAGE  
  167.     # if x == ord('1'):  
  168.     #      username = get_param("Enter the username")  
  169.     #      homedir = get_param("Enter the home directory, eg /home/nate")  
  170.     #      groups = get_param("Enter comma-separated groups, eg adm,dialout,cdrom")  
  171.     #      shell = get_param("Enter the shell, eg /bin/bash:")  
  172.     #      curses.endwin()  
  173.     #      execute_cmd("useradd -d " + homedir + " -g 1000 -G " + groups + " -m -s " + shell + " " + username)  
  174.     # if x == ord('2'):  
  175.     #      curses.endwin()  
  176.     #      execute_cmd("apachectl restart")  
  177.     # if x == ord('3'):  
  178.     #      curses.endwin()  
  179.     #      execute_cmd("df -h")  
  180.     #  
  181.     #exit()  
  182.     #screen.refresh()  
  183. screen.keypad(0)  
  184. curses.echo() ; curses.nocbreak()  
  185. screen.clear()  
  186. curses.endwin()  
  187.   
  188.   
  189.       

 

时间: 2024-10-31 09:57:36

python + curses 在终端上开发光标菜单的相关文章

php调用python失败 在终端执行有输出,在浏览器上没有输出

问题描述 php调用python失败 在终端执行有输出,在浏览器上没有输出 这是python脚本 #!/usr/bin/python m?=?3.12345612345 print?(m); 这是PHP的脚本 <?php $output=shell_exec('python?helloworld.py'); echo" $output "; ?> 这样调用时浏览器是可以输出结果的 但是当Python脚本为: #!/usr/bin/python import?epics m?

《Python Cookbook(第2版)中文版》——1.25 将HTML文档转化为文本显示到UNIX终端上

1.25 将HTML文档转化为文本显示到UNIX终端上 任务 需要将HTML文档中的文本展示在UNIX终端上,同时还要支持粗体和下划线的显示. 解决方案 最简单的方法是写一个过滤的脚本,从标准输入接收HTML,将输出文本和终端控制序列打印到标准的输出上.由于本节的问题只针对UNIX,我们可以借助Python标准库的os模块提供的popen函数,通过UNIX的命令tput获取所需的终端控制序列: #!/usr/bin/env python import sys, os, htmllib, form

python curses使用

一.语法入门 1.打开和关闭一个curses 应用程序 在任何代码执行前都先要初始化curses.初始化操作就是调用initscr()函数,如下.该函数根据不同设备返回一个window对象代表整个屏幕,这个window对象通常叫做stdscr,和c语言报错一致. import curses stdscr = curses.initscr() 使用curses通常要关闭屏幕回显,目的是读取字符仅在适当的环境下输出.这就需要调用noecho()方法 curses.noecho() 应用程序一般是立即

Python实现设置终端显示颜色、粗体、下划线等效果

也许你希望在终端上输出一些带有颜色或者粗体.下划线等样式的信息,就像man中的那样,那么这篇文章将会起到些许作用. 事件起因 在Python开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中. 但是很杂乱的信息显示在一起,往往没有重点,一个一个找我们需要的信息往往特别复杂. Linux下的终端设置 linux终端颜色设置信息 在Linux终端中,使用转义序列来进行如上所述的显示,转义序列以ESC开头,即ASCII码下的\033,其格式为: \

在Visual Studio上开发Node.js程序

原文:在Visual Studio上开发Node.js程序 [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio(NTVS),虽然现在仅发布了1.0 Alpha版本,但使用起来已经非常方便.而且,其开发团队与Python Tools for Visual Studio(PTVS)是同一个,而PTVS就是Visual Studio 2013中要创建自带

学习如何在基于IBM POWER的服务器上开发和部署Linux应用程序

在 IBM System p 和 System i POWER 平台上开发和部署 Linux 应用程序与在其他 Linux 系统上的开发和部署相似.在本文中,讨论对于 Linux on POWER 系统应该了解的相似性和差异. 简介 System p 和 System i 服务器都基于相同的 POWER 处理器架构,在 System p 或 System i 上的 Linux 发行版中编译的二进制代码可以在这两种平台上运行.但是,在 System p 和 System i 服务器之间,I/O 支

使用RadControls的RadMenu控件开发系统菜单

关于菜单这个话题我想应该是不讲则懂,所以本文不会多讲这些概念,则重关注RadControls控件中的RadMenu控件的使用,结合数据库来开 发一个系统菜单. 一.数据库设计 这里我就使用Access作为示例数据库,详细见下图: 开发系统菜单-radcontrols"> 表字段依次为:自动编号.菜单编码.菜单名称.请求地址.菜单上显示的图片地址.快捷键(RadMenu控件支持).菜单顺序.菜单级限. 是否为末级和父菜单编码. 整个设计中主要以菜单编码作为关联依据. 二.注册控件及使用控件皮

在 Apache Tuscany 上开发基于 SCA 的 Web 2.0 应用

引言 如今在企业级应用中,Ajax.Widget.RSS/Atom 等 Web 2.0 技术正在得到越来越广泛的使用,这些技术不但产生了良好的用户体验,同时也来越来越多地影响着许多前端系统的编程模式和系统架构.许多传统的 Java EE 产品和框架也在越来越多地引入这些 Web 2.0 技术,如 Struts2 和 JSF 都有了越来越完善的 Ajax 扩展,Portal 产品中也基于 Dojo 等 javascript 框架引入部分刷新等机制,大幅提升了性能和用户体验.可以看出,Web 2.0

android-Android 终端模拟器开发

问题描述 Android 终端模拟器开发 2C 如何在android apk中实现linux系统终端的功能?比如像Android Terminal Emulator这个apk一样,显示一个终端界面,可以输入命令可以执行,求大神给出思路. 解决方案 Android上的linux终端模拟器 解决方案二: 写一个命令解析器调用shell执行