我几天前开始学习tcl,目前正在尝试创建一个简单的密码管理器gui应用程序。我在不同的文件中使用tcl/tk创建了两个顶层窗口,而不是使用source命令从主tcl文件中调用。我决定拆分处理哈希的其他tcl函数;检查散列;以及另一个tcl文件中的文件IO。然后我将通过";导入功能文件";。我想从与包含gui代码的另一个tcl文件相同的目录中导入各种tcl函数,很像python的导入系统。然而,我在创建包时遇到了不同的困难,我已经查找了尽可能多的指南,但仍然对这个过程感到困惑。我在函数文件中创建了一个名称空间,然后添加了一行,然后运行pkg_mkIndex.*。tclsh shell中的tcl。然后,我将requires函数文件添加到gui小部件文件中,并将lappend auto_path命令放在该文件的顶部。然而,当我运行该文件时,我会收到一个烦人的"找不到包"弹出窗口。注意:我在windows上使用tcl interporter。任何帮助都会非常感激,而且我对编程和tcl还比较陌生,所以任何其他技巧也会很有帮助。提前感谢!
小部件文件在头中包含此内容
lappend auto_path "C:Usersj715ccoding_projectstcltcl_projpassword_manager"
package require FileHandler
功能文件包含此
package provide FileHandler $FileHandler::version
package require Tcl 8.5
package require sha256
namespace eval ::FileHandler {
namespace export check_password_attempt load_file check_null_file check_hash hash write_file parse_entries
set version 1.0
set hashedpass ""
}
github 上的完整代码
当我尝试生成pkgIndex.tcl
文件时,我会得到以下错误:
$ echo 'pkg_mkIndex -verbose . *.tcl' | tclsh
warning: error while sourcing FileHandler.tcl: can't read "FileHandler::version": no such variable
在定义版本变量之前,您正在使用它。别忘了Tcl是一种解释语言。
试试这个:
namespace eval ::FileHandler { variable version 1.0 }
package provide FileHandler $FileHandler::version
package require Tcl 8.5-
package require sha256
namespace eval ::FileHandler {
namespace export check_password_attempt load_file check_null_file check_hash hash write_file parse_entries
variable hashedpass ""
}
请注意,所需的Tcl版本以-
结尾,因此可以使用Tcl 8.6。
现在,
$ echo 'pkg_mkIndex -verbose . *.tcl' | tclsh
successful sourcing of FileHandler.tcl
packages provided were {FileHandler 1.0}
processed FileHandler.tcl
$ cat pkgIndex.tcl
# comments ...
package ifneeded FileHandler 1.0 [list source [file join $dir FileHandler.tcl]]
$ tclsh
% lappend auto_path .
% package req FileHandler
1.0