跨语言的表单生成器TK FormGen

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")
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485