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

问题描述

我正在尝试创建一个由多个 tcl 源文件组成的 starkit,它可以在我的机器上使用 wish 毫无问题地执行。但是,在尝试对 tclkit 执行相同操作时,我从直接源自 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 将所有源文件合并为一个。因此,我怀疑这是某种竞争条件,但我既无法证明也无法调试。

对不起,如果我在这里遗漏了任何重要的东西(对 tcl/tk 来说很新)。真的很感激任何建议。首先十分感谢! :)

解决方法

Snack 主要是一个声音工具包。它向 Tcl 添加了一个 //NewtonSoft JSON var arrayOfColors = JsonConvert.DeserializeObject<custColor[]>(myJson); var valueFromArray = arrayOfColors[0].value; //Will give #f00 var dynamicColorArray = JsonConvert.DeserializeObject<dynamic>(myJson); var valueFromDynArray = dynamicColorArray[0].value; //Will also give #f00 //System.Text.Json var stjArrayOfColors = System.Text.Json.JsonSerializer.Deserialize<custColor[]>(myJson); var stjValueFromArray = stjArrayOfColors[0].value; //Will give #f00 命令,用于处理音频(播放、录音等)。当与 Tk 结合使用时,它还向 Tk 画布添加了一个波形项类型。为此,必须在零食之前加载 Tk。使用 snack::sound 时,从一开始就加载 Tk。但是对于 tclkit(除非在 Windows 上运行),必须使用 wish 命令加载 Tk。

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

package require Tk

当我交换前两行时,错误消失了。所以:

package require snack
package require Tk

snack::sound snd
snd read foo.wav

canvas .c
.c create waveform 0 0 -sound snd