在与其他源 tcl 文件相同的目录中创建 tcl 包的问题
Posted
技术标签:
【中文标题】在与其他源 tcl 文件相同的目录中创建 tcl 包的问题【英文标题】:Issues with creating a tcl package in same directory as other source tcl files 【发布时间】:2021-06-11 14:43:55 【问题描述】:我几天前开始学习 tcl,目前正在尝试创建一个简单的密码管理器 gui 应用程序。我使用 tcl/tk 在单独的文件中创建了两个***窗口,而不是打算使用 source 命令从主 tcl 文件调用。我决定拆分其他处理散列的 tcl 函数;检查哈希值;并将 IO 文件放在另一个 tcl 文件中。然后我会通过“导入函数文件”将这些函数绑定到 gui 小部件。我想从与另一个包含 gui 代码的 tcl 文件相同的目录中导入各种 tcl 函数,就像 python 的导入系统一样。但是,我在创建软件包时遇到了困难,我已经查找了尽可能多的指南,但仍然对这个过程感到困惑。我在函数文件中创建了一个命名空间,然后添加了一个提供的行,然后运行 pkg_mkIndex 。 *.tcl 在 tclsh 外壳中。然后我在 gui 小部件文件中添加了 requires 函数文件,并将 lappend auto_path 命令放在文件顶部。但是,一旦我运行该文件,我就会得到一个烦人的找不到包弹出窗口。注意:我在 Windows 上使用 tcl interperter。任何帮助都会得到极大的帮助,而且我对编程和 tcl 也比较陌生,所以任何其他提示也会有所帮助。提前致谢!
小部件文件在标题处包含此内容
lappend auto_path "C:\Users\j715c\coding_projects\tcl\tcl_proj\password_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 ""
full code here on github
【问题讨论】:
使用variable
来定义那些命名空间变量,而不是set
(因为否则你可以使用带有变量解析器的“fun”)。我也更喜欢将package provide
放在我的脚本末尾。
【参考方案1】:
当我尝试生成 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
【讨论】:
谢谢,这行得通,我不知道它们是 pkg_mkIndex 的详细标志,这对调试很有帮助。以上是关于在与其他源 tcl 文件相同的目录中创建 tcl 包的问题的主要内容,如果未能解决你的问题,请参考以下文章