 .LOG

CTerm Python脚本支持简介

目前为止，Enable python后可以做到：
 >更准确的url识别。由于采用了python的正则表达式，误识别率大大降低。可以识别跨行URL
 >可定制的状态识别，目前以关键字为主
   (若发现有状态识别不正确，导致功能失效，可自己按情况添加修改关键字，甚至修改识别算法)
 >cterm启动时连接站点(OnCTermStart)
 >自定义命令中可以执行python语句或脚本
 >编写python脚本完成自动任务
 >...

脚本(包括vbs等脚本)默认放在CTerm运行目录的script子目录下
可以通过修改配置参数ScriptDir定制

脚本分两类：系统控制脚本与用户脚本
前者就是ct_system.py，必须位于上述ScriptDir下
由CTerm调用，提供各种事件。其中事件的响应函数中的代码可由用户自己编写

用户脚本是用户编写的任意脚本，由用户手动，或通过自定义命令执行，也可以通过事件响应函数调用
不必一定位于ScriptDir下


运行环境：
CTerm 3.262 build 060830 +
Python 2.5 +
最新版本Python(2.5c1)下载地址: http://www.python.org/ftp/python/2.5/python-2.5c1.msi

注：不安装python也可以运行，可以从附带的python25.zip导入相关模块
只是如果你写的脚本需要用到该zip里不包含的模块，如email,ftp什么的，就找不到了:)

◆ CTerm事件
CTerm脚本目前能够响应的事件如下(事件名称基本兼容STerm)：

OnCTermStart() //CTerm启动，关闭事件
OnCTermClose()

antiIdle(ID) //防发呆。参数为窗口唯一标识，以下同
OnTimer(ID)		//每秒触发一次
OnDataCome(ID) //数据到来时触发，这时显示完成，状态识别也已完成(目前由CTerm进行识别状态)
					 //在其中set与clear ID对应的dataEvent，以通知等待数据的线程
OnSessionOpen(ID) //当打开一个子窗口时触发
OnSessionClose(ID) //当关闭一个子窗口时触发

//下面为鼠标键盘事件
OnMouseMove(ID, x, y) //x, y为字符位置，下同
OnLButtonUp(ID, x, y)
OnRButtonUp(ID, x, y)
OnMButtonUp(ID, x, y) //中键或鼠标滚轮按下
OnKeyDown(ID, nChar, nRepCnt, nFlags) //这个nFlags很可能会出问题，所以不可靠
//OnKeyDown可返回值1(按键已经由该函数处理，不需要cterm处理)，或0
//格式return (1,) 或(0,)

OnParseURL(ID, x, y) //需要解析URL时调用

OnGetStatus(ID)	//以关键字识别为主，若出现状态识别不正确
		//可自己根据情况修改站点配置数据文件sitestatus.py
		//若仍不能满足需要，亦可改写数据结构和OnGetStatus()及相关函数，实现新的更细致的算法
		//站点类型与状态常数见sitestatus.py
OnGetMessage(ID) //暂为空

◆ CTerm内建模块
提供了一组可由Python调用的功能函数，用以访问CTerm内部数据或方法
使用前需用import CTerm导入(系统脚本或用户脚本中)
调用格式(用from CTerm import *导入，可省略前面的CTerm.):
CTerm.GetSiteType(ID, [...])
基本每个模块函数都需要一个ID为参数，以指明对哪个窗口操作
此ID可以由sys.argv取得，也可手动调用CTerm.GetSessionID()取得，或者由事件响应函数给出

提供的函数如下(函数名称与qterm或sterm基本兼容)：
- GetSessionID([n]) //n为窗口序号，若未指定，取当前窗口
- GetSessionNum() //子窗口个数
- SetScriptInfo(s) //设置状态栏信息

- GetWorkDir() //取cterm工作目录
- GetScriptDir() //取默认python脚本路径

- GetSiteType(ID) // ID为窗口标识，下同
- GetSessionName(ID)		// 地址薄中的站点名
- GetHostAddress(ID)
- GetHostPort(ID)
- GetLoginID(ID)		// 自动登录时的ID与密码
- GetLoginPW(ID)
- GetTermWidth(ID=None)	//term列数, None时取当前窗口。目前没有实现为站点参数，为全局变量，所以参数是什么没有影响:)
- GetTermHeight(ID=None)//term行数

- GetStatus(ID) // 取CTerm内部已经识别完成的状态，若使用了OnGetStatus，可siteStatus字典亦可用(除ST_MESSAGE)外
- GetSubStatus(ID)

- GetText(ID, start, end=-1, scrn=0) //拷贝从start到end行的屏幕文本, end=-1时只拷start一行; scrn=0末屏，1当前屏，2：绝对行数
- GetAttrText(ID, start, end=-1): 取ANSI文本。参数含义同GetText
- GetSelectText(ID) //选定文本，若无选定，复制全屏

- SendString(ID, s) //直接发送数据
- SendParsedString(ID, s)
				//解析后发送，其中可包含支持的转义序列，变量等，参见esccode.txt
				//事实上由于Python支持所有的转义序列，所以该函数存在的意义不大
				//除了需要使用CTerm特殊的转义符外，一般用SendString即可
- CaretX(ID)
- CaretY(ID)

- IsConnected(ID)
- Disconnect(ID)
- Reconnect(ID)	//连接断开且窗口未关闭时重连
  ConnectSite两种调用方式:
- ConnectSite(siteName) //siteName为地址薄中的站点名
- ConnectSite(address, port)

- SendCommand(cmdid) //执行CTerm内部命令，允许执行的命令见cterm_command.py
- GetPicture(url) //调用内部图片浏览器下载显示图片

- CTerm.AntiIdleString(s=None): 取/设防呆串
- CTerm.AntiIdleTime(t=None): 取/设防呆时间(秒)
- SetAutoReply(s=None) //设置自动回复的消息串, s=None时取消自动回复

◆ 关于session ID:
python callback函数(事件响应函数)的参数ID由CTerm产生事件时给出
每个expose函数都需要一个ID，如果没有。。。是不行的

在执行用户脚本或代码时，sys.argv[0]是系统传过来的调用窗口的ID
可用它来对调用窗口操作(先用long()把字符串转成整数)
若调用时没有活动窗口，该值为-1，不可执行需要ID的CTerm模块函数
若要对其它窗口：如对第i个窗口操作，先用GetSessionID(i)取得其ID
i为-1或未给出，表示活动窗口

◆ 用户脚本与用户代码
用户代码与用户脚本基本性质相同，只是后者不单独存成一个文件，而直接由自定义命令给出
一般用于执行代码量很少、较简单的工作

执行用户脚本时可由sys.argv取得调用该脚本的窗口ID：
ID=long(sys.argv[0])

在用户脚本中，如果有自定义函数，比如fun()
若fun()需要访问该脚本中函数外部定义的变量或函数，则它们必须显式声明为global
这是因为脚本本身是在CTerm内部的Python环境内执行的，脚本中的对象全是local对象

用户脚本的执行环境被设为ct_system，所以系统脚本中的所有变量与函数对用户脚本均是可见的
包括事件与状态变量。所以可能在其实等待dataEvents，当数据到来时由系统脚本触发

◆ 输出与错误信息
sys.stdout与sys.stderr(globals.py中)被重定向为CTerm执行目录下的python.cterm.log
在调试脚本时可以参考该文件中的输出


◆ 相关文件
python25.dll	基本python语言支持
python25.zip	python扩展模块支持
__sre.pyd	正则表达式模块
globals.py	其中导入以下各模块，为用户脚本建立执行环境(包含在python23.zip里)

script目录下：
ct_system.py	系统事件回调函数
sitestatus.py	状态常数(供状态识别函数OnGetStatus用)
cterm_command.py内部命令常数，用于OnSendCommand函数(不得更改)
tools.py	辅助函数
其它		测试与示例
*.pyc		执行过程中产生的中间编译结果

12:24 2006-8-30

20:09 2007-05-20

2:40 2007-09-29

11:12 2007-10-28
