TK FormGen是一个基于Tcl-Tk开发的多功能表单生成器,它能够创建从简单的信息提示框到包含文本字段、组合框、单选按钮等元素的复杂表单。这个工具不仅可以被Tcl应用程序使用,还可以被其他语言调用,特别是那些没有原生图形用户界面(GUI)支持的语言。本文将介绍如何使用TK FormGen,并展示其在不同编程语言中的应用实例。
TK FormGen由两个脚本组成:fGen.tcl负责生成表单,而fGenProc.tcl包含了一些辅助过程。后者会被前者自动包含。要使用这个表单生成器,可以通过以下方式调用:
1. 通过Tcl脚本调用:
proc cBack {data} {
foreach id [dict keys $data] {puts "$id\t : [dict get $data $id]"}
exit
}
append src [file dirname [file normalize [info script ]]] "/fGen.tcl"
source $src
set ask "Title,Form generalities;Ground,silver;"
append ask "CMB,Theme,,,|alt|clam|classic|default|vista|winnative|xpnative;"
append ask "CMB,Ground,,,|cyan|gray|magenta|olive|silver|teal;"
append ask "CMB,Form,Form type,,|T:Texts|B:Buttons|C:Combo boxes|F:Files and folders|S:Scales and combos;"
append ask "Default,Theme:clam,Ground:teal;"
formGen[list $ask cBack]
2. 直接从命令行调用,例如:
tclsh fgen.tcl "T,name,User name;P,psw,Enter password" data.json
3. 通过其他语言调用:
使用TK FormGen与其他语言结合时,可以通过执行TCL解释器的外部命令来生成表单,并通过标准输出读取数据,然后将其转换为宿主语言的内部变量。
以下是一些使用TK FormGen的示例,包括一个表单的创建和数据的处理。当表单关闭时,数据会以Json格式发送到标准输出,以便转换为宿主语言的内部变量。
以下是创建表单的参数列表,包含在文件params.txt中:
CMB,Theme;# themes are set at the beginning with the available themes;
Labels,Right, :;
Comment,Hexadecimal color value must have the form #RRGGBB;
CMT,Ground,,,|cyan|gray|magenta|olive|silver|teal|#C0D0E0;
CMB,Form,
Form examples,,|Texts|Buttons|Combo boxes|Files and folders|Scales and Check box;
T,try,Try this,400;
Default,Theme:clam,Ground:teal;
Validate,Ground is ^#[0-9a-fA-F]{6}$,Not valid color;
Default,try:C#2CThis is a form for test some widgets\nCondor Informatique - Turin#3b
CMB#2CGround#2C#2C#2C|cyan|gray|magenta|olive|silver|teal|#C0D0E0;
在所有测试过的编程语言中,表单都是通过执行TCL解释器的外部命令来生成的,数据从标准输出读取并转换为内部变量。
以下是一些不同语言中使用TK FormGen的示例:
>ruby tcltk.rb
{
"fg_Button" => "Ok",
"Text" => "Text",
"psw" => "Lafayette77",
"Mail" => "ross@lib.it",
"Number" => -11,
"Integer" => 17,
"DecNumber" => 3.1415,
"textArea" => "big\ttext\n\n"
}
Sum: 9.141500
>Exit code: 0
// C++ 11
#include
using namespace std;
map json2Map(string jsonData) {
map dataMap;
string regExspr("\\\"(\\w+)\\\":\\s*(\\\"([^\"]*)\\\"|(([+-]?\\d*)(\\.\\d+)?))");
regex re(regExspr);
for(sregex_iterator it = sregex_iterator(jsonData.begin(), jsonData.end(), re);it != sregex_iterator(); it++) {
smatch match;
match = *it;
int indexValue = 3;
if(match.str(3) == "")
indexValue = 2;
cout << match.str(1) << "\t" << match.str(indexValue) << endl;
dataMap[match.str(1)] = match.str(indexValue);
}
return dataMap;
}
int main(int numberArgs, char * argsList[]) {
vector params{"fGen.tcl", "T,t1;N,n1", "", ""};
int commandLength = 40;
string tcl = "tclsh " + params[0] + " " + params[1] + " " + params[2] + " " + params[3];
int status = system(tcl.c_str());
ifstream jsonFile("j.json");
string jsonData {istreambuf_iterator(jsonFile), istreambuf_iterator()};
cout << jsonData << endl;
map dataMap = json2Map(jsonData);
if (dataMap.count("Integer") > 0) {
cout << "Sum: " << (atof(dataMap["Integer"].c_str()) +
atof(dataMap["Number"].c_str()) + atof(dataMap["DecNumber"].c_str())) << endl;
}
return 0;
}
以上代码展示了如何在C++中使用TK FormGen,通过正则表达式解析Json数据并将其存储在map中。
const args = process.argv.slice(2)
const {exec} = require('child_process');
var command = 'tclsh ' + args[0] + '"' + args[1] + '" ' + args[2] + '" ' + args[3]
const tcl = exec(command, function(error, stdout, stderr) {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log('Child Process STDOUT: ' +stdout);
});
let jsonData = '';
tcl.stdout.on('data', (chunk) => {
jsonData += chunk.toString();
});
tcl.on('exit', () => {
console.log(jsonData);
var data = JSON.parse(jsonData)
if ("Integer" in data) {
console.log("Sum " + (data.Integer + data.Number + data.DecNumber))
}
});
以上代码展示了如何在Node.js中使用TK FormGen,通过子进程执行Tcl脚本并处理输出的Json数据。
import os
import subprocess
import json
def main():
os.chdir("C:\\Sviluppo\\fGenTk\\")
p = subprocess.Popen("tclsh fGen.tcl params.txt handler.tcl::tryForm handler.tcl::handle",
shell=True, stdout=subprocess.PIPE)
stdout, stderr = p.communicate()
data = json.loads(stdout.decode('utf-8'))
print(data)
if 'Integer' in data:
print ("Sum: {}".format(data['Integer'] + data['Number'] + data['DecNumber']))
if __name__ == '__main__':
main()
以上代码展示了如何在Python中使用TK FormGen,通过子进程执行Tcl脚本并处理输出的Json数据。
library("rjson")
setwd("C:\\Sviluppo\\fGenTk")
parameters <- c("fGen.tcl", "params.txt", "handler.tcl::tryForm", "handler.tcl::handle")
json <- system2("tclsh",parameters,stdout=TRUE)
tmp <- tempfile()
cat(json,file = tmp)
data <- fromJSON(readLines(tmp))
data$fg_Button
if ("Integer" %in% names(data))
cat("Sum:",data$Integer + data$Number + data$DecNumber,"\n")