tcl/tk-多文件starkit中的依赖项库问题

tcl/tk-多文件starkit中的依赖项库问题,tcl,tk,tcltk,starkit,Tcl,Tk,Tcltk,Starkit,我正在尝试创建一个由多个tcl源文件组成的starkit,使用wish可以在我的机器上毫无问题地执行。但是,在尝试对Tlckit执行相同操作时,我从直接来自main.tcl的顶级源文件中获取的一个二级源文件中得到了此错误 unknown or ambiguous item type "waveform" while executing "$c create waveform 0 0 -sound snd -height $v(waveh) -width $v

我正在尝试创建一个由多个tcl源文件组成的starkit,使用
wish
可以在我的机器上毫无问题地执行。但是,在尝试对Tlckit执行相同操作时,我从直接来自
main.tcl
的顶级源文件中获取的一个二级源文件中得到了此错误

unknown or ambiguous item type "waveform"
    while executing
"$c create waveform 0 0 -sound snd -height $v(waveh) -width $v(cWidth)  -tags [list obj wave] -debug $::debug -fill $v(wavColor) -limit $v(waveScale)"
    invoked from within
"if $v(showWave) {
    $c create waveform 0 0 -sound snd -height $v(waveh) -width $v(cWidth)  -tags [list obj wave] -debug $::debug -fill $v(wavColor) ..."
    (procedure "Redraw" line 28)
    invoked from within
"Redraw all"
    (procedure "resetDisplay" line 21)
    invoked from within
"resetDisplay"
    (file "MYAPPLICATION.vfs/TOPLEVEL.tcl" line 591)
waveform
来自
snack
库,所以我研究了它。该库没有未解析的外部依赖项,如果根本无法使用该库,则错误可能会发生得更早,因此我尝试了以下方法:

  • 从源代码重新编译
    snack
  • 直接将
    snack
    编译到tclkit运行时中(而不是作为vfs中的库)
  • 再次将
    package require snack
    添加到相关的源文件中
  • 使我的应用程序成为
    lib
    中的包,而不是直接vfs目录中的包
以上这些都不起作用。我发现的唯一有效方法是通过替换
source
s将所有源文件合并为一个。因此,我怀疑这是某种竞争条件,但我既无法证明它,也无法调试它


很抱歉,如果我遗漏了任何重要的内容(对于tcl/tk来说是新的)。如果您有任何建议,我将不胜感激。非常感谢!:)

零食主要是一种健康的工具包。它向Tcl添加了一个
snack::sound
命令,用于处理音频(播放、录制等)。当与Tk结合使用时,它还向Tk画布添加波形项类型。要使其工作,必须在零食之前加载Tk。使用
wish
时,从一开始就加载Tk。但是,对于tclkit(除非在windows上运行),Tk必须使用
包require Tk
命令加载

我可以使用以下代码重现您的错误:

package require snack
package require Tk

snack::sound snd
snd read foo.wav

canvas .c
.c create waveform 0 0 -sound snd
当我交换前两行时,错误消失了。因此:

package require Tk
package require snack

哪个操作系统?我可以想象,如果在零食之前加载Tk,零食只会添加画布项目类型。当使用wish时,这是有保证的。但是tclkit可能不是这样(Windows除外)。@SchelteBron为了完整起见,操作系统是Linux(更具体地说是Ubuntu18.04 LTS)。
require
s的顺序确实是导致问题的原因。它解决了问题。我真是太傻了,没能找出问题所在XwX非常感谢您的友好指导!我已将答案标记为已接受,并将在获得足够的声誉点数后进行投票。(很抱歉,我还是新来的(^^;)