python curses模块 curses

curses的名字起源于"cursor optimization",即光标优化。它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的, 用来处理一个游戏rogue的屏幕显示。后来贝尔实验室的Mark Horton在System III Unix中重新编写了curses。现在几乎所有的Unix,Linux操作系统都带了curses函数库,curses也加入了对鼠标的支持,一些菜单和面板的处理。

总的来说,curses是一个在Linux/Unix下广泛应用的图形函数库. 以前学过TC2.0的朋友肯定还记得TC里边有一个图形库BGI(Borland Graphics Interface, 还记得那个<graphics.h>头文件吗:). 用它我们可以绘制在DOS下的用户界面和漂亮的图形. 而Linux/Unix编程给人的感觉就比较"cool"一点, 好像Linux编程都是在黑黑的终端下进行的.确实是这样,许多Linux高手都喜欢在终端方式下工作, 熟悉了一些命令以后,这样的工作方式效率还是很高的. 但是长久地看着黑黑的屏幕难免让人感到厌倦, 特别是像我这样接触Linux不久的菜鸟:) 有没有一种工具能让我们在Linux下编出好看的图形呢? 答案是肯定的, 它就是curses!


curses的名字起源于"cursor optimization",即光标优化. 它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的, 用来处理一个游戏rogue的屏幕显示. 后来贝尔实验室的Mark Horton在System III Unix中重新编写了curses. 现在几乎所有的Unix, Linux操作系统都带了curses函数库, curses也加入了对鼠标的支持, 一些菜单和面板的处理. 可以说, curses是Linux终端图形编程的不二选择(比如著名的文字编辑器 vi 就是基于curses编的);


OK, 闲话少说,现在我们开始进入正题:


首先我们应该了解, 在终端使用的屏幕模式是基于文本的. 所以在开始使用curses前, 需要用initscr()函数初始化屏幕. 对应的, 程序结束需要调用endwin();函数来关闭curses状态.


有了这个概念, 我们就可以来写著名的"Hello, world!"之curses版了:


/*-----------------------------------------------------------------


A very simple example of curses programming


coder: jellen


date: 3-26-2004


----------------------------------------------------------------*/


#include <curses.h>


int main()


{


initscr();


box(stdscr, ACS_VLINE, ACS_HLINE); /*draw a box*/


move(LINES/2, COLS/2); /*move the cursor to the center*/


waddstr(stdscr, "Hello, world!");


refresh();


getch();


endwin();


return 0;


}


呵呵, 刚才忘了说了. 我们调用curses库一般是用C语言的(没什么奇怪, C可以说是Linux的官方语言, 不过你也可以用C++或Python等语言调用curses的, 这无关紧要). 假设我们把这个程序保存为 hello.c


不过不要急着用gcc -o hello hello.c去编译运行(我知道你会用gcc:) 那样是不能通过编译的. 因为curses库不在标准路径上, 所以我们要加上 -lcurses连接选项, 像这样:


gcc -o hello hello.c -lcurses


现在你用 ./hello 运行一下程序看看,是不是出现了你所期望的窗口.


现在我们来一行行分析一下代码.


#include <curses.h> /*这是每个 curses 程序都必须包含的头文件,表明使用了curses库*/


然后主函数中第一句initscr();初始化了屏幕, 使之开始进入curses图形化工作方式.


其实我们现在没有自己建立窗口, 用的是标准屏幕 stdscr(就象C里面标准输入stdin, 标准输出stdout一个概念), 它就是我们面前的电脑屏幕(不过现在还是黑黑的:)


下面一句: box(stdscr, ACS_VLINE, ACS_HLINE); 画了一个框. 有了这个框我们才有"窗体"的感觉. stdscr就是标准屏幕, ACS_VLINE和ACS_HLINE代表构成方框两边的基本元素, 你也可以用 '|'和'-'代替, 不过可能没有ACS_VLINE, ACS_HLINE好看了.


move(LINES/2, COLS/2);


waddstr(stdscr, "Hello, world!");


这两句是把光标移到屏幕中间, 然后输出我们的"Hello, world!"


LINES 和 COLS是curses定义的宏, 代表当前屏幕的最大行数和列数. waddstr()函数的作用是在stdscr上打印字符串"hello, world!"


屏幕分物理屏幕(我们所看到的)和逻辑屏幕(在内存中的), 我们调用函数时修改的是逻辑屏幕,它不会在当前物理屏幕上显示出来.所以现在屏幕上还是什么也没有, 需要调用refresh()把我们对逻辑屏幕的改动在物理屏幕(显示器)上显示出来. 然后用getch()让屏幕暂停一下.


最后调用endwin()结束curses, 恢复原来的屏幕.


好了, 我们完成了第一个例子的分析. 是不是挺简单的?


不过不尽如人意的是屏幕还是那个样子, 没有什么色彩. 要加色彩? 那也是挺容易的: 首先用start_color()函数开启颜色模式, 然后设置我们要的颜色就行了.


curses里的颜色是配对的, 要一个背景色对一个前景色. 使用之前用init_pair()初始化.


比如init_pair(1, COLOR_BLUE, COLOR_GREEN);就定义了一组颜色, COLOR_BLUE为前景色, COLOR_GREEN为背景色. 1是它们的标记号码(供其他函数调用时使用) 我们来看一个简单的例子:


/*--------------------------------------------------------------


A simple curses color demo program


Coder: jellen


Date: 3-26-2004


-------------------------------------------------------------*/


#include <curses.h>


int main()


{


initscr(); /*初始化屏幕*/


if(start_color() == OK) /*开启颜色*/


{


init_pair(1, COLOR_RED, COLOR_GREEN); /*建立一个颜色对*/


attron(COLOR_PAIR(1)); /*开启字符输出颜色*/


move(LINES/2, COLS/2);


waddstr(stdscr, "Yet another Hello, world!");


attroff(COLOR_PAIR(1)); /*关闭颜色显示*/


refresh();


}


else


{


waddstr(stdscr, "Can not init color");


refresh();


}


endwin(); /*关闭curses状态*/


return 0;


}


这个程序假如保存为color.c


那么你可以这样编译了: gcc -o color color.c -lcurses


用./color一运行, 是不是有几个彩色的字? 呵呵, 虽然不好看, 但是说不定你自己以后可以用curses写出精美的程序.


ubuntu 用户 如果 没有 curses.h库,可以用一下命令下载: apt-get install libncurses5-dev


如果想做更多了解,可以去下边网址看看:


http://www.ibm.com/developerworks/cn/aix/library/au-shellcurses/index.html

python curses模块 curses
  

爱华网本文地址 » http://www.aihuau.com/a/8103380103/78023.html

更多阅读

怎么在qq空间添加视频模块? qq空间视频模块

怎么在qq空间添加视频模块?——简介 qq空间数量是惊人的,同样有大量的网友希望能在自己的空间里加上自己喜欢的视频。但是大部分童鞋们还不知道怎么添加,网上的方法很多。参差不齐。我也是一个空间密。没事就倒腾空间,在空间里添加视频

HC-05蓝牙模块与单片机的使用 hc05蓝牙模块

HC-05蓝牙模块与单片机的使用——简介关于HC-05蓝牙模块如何搭配单片机使用,还是以Arduino UNO升级改进版Manduino UNO为例,进行说明。HC-05蓝牙模块适用于各种3.3V的单片机系统,模块可以使用AT指令设置波特率配对、密码用户信息等,默

破解phpweb如何安装所需模块 phpweb破解post.php

破解phpweb如何安装所需模块——简介 phpweb(成品网站)现在用的人已经很多了,有正版授权的,也有所谓破解版的。当然在使用的过程中就能发现正版与破解版的区别了,相信用过的人都有体会,破解的不能升级、模块不能安装……这些问题都困扰着

声明:《python curses模块 curses》为网友隔纱相望分享!如侵犯到您的合法权益请联系我们删除