微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在与其他源 tcl 文件相同的目录中创建 tcl 包的问题

如何解决在与其他源 tcl 文件相同的目录中创建 tcl 包的问题

几天前我开始学习 tcl,目前正在尝试创建一个简单的密码管理器 gui 应用程序。我在单独的文件中使用 tcl/tk 创建了两个顶级窗口,而不是我打算使用 source 命令从主 tcl 文件调用。我决定拆分其他处理散列的 tcl 函数;检查哈希值;并将 IO 文件放入另一个 tcl 文件中。然后我将通过“导入函数文件”将这些函数绑定到 gui 小部件。我想从与包含 gui 代码的其他 tcl 文件相同的目录中导入各种 tcl 函数,很像 python 的导入系统。然而,我在创建包时遇到了困难,我已经查找了尽可能多的指南,但仍然对这个过程感到困惑。我在函数文件中创建了一个命名空间,然后添加一个提供的行,然后运行 ​​pkg_mkIndex 。 *.tcl 在 tclsh shell 中。然后我将 requires 函数文件添加到 gui 小部件文件,并将 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

解决方法

当我尝试生成 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。