# 2008/12/09 03:19 @ Sean Zhang
这个问题其实有多个表述方式:
关于这个问题的灵感来自于自己的一个项目。这个项目中,希望可以用一个新的顶级窗口(.)加载第三方Tk应用程序。
[[http://wiki.tcl.tk/2437|Using Tk as a loadable package]] 给出了可能的办法。
package require Tk # 使用实例 set interp [interp create] $interp eval { package require Tk }
这种方法要求Tcl的 auto_path 应当包含相应的初始化Tk包的脚本。比如:
if {[catch {package present Tcl 8.5.4}]} { return } package ifneeded Tk 8.5.4 [list load [file join $dir .. .. bin tk85.dll] Tk]
# Linux/Unix load libtk8.3.so # works for Windows (MPJ) load tk83.dll # Mac OS X: load libTk8.3.a # 使用实例 set interp [interp create] load libtk8.3.so $interp
上面的办法需要知道相应的 .dll 或 .so 文件的名字。更好的办法是把Tk作为静态包加载。
在C程序中加入
Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit);
在Tcl中就只需要简单的如下操作即可
# 使用实例 set interp [interp create] load {} Tk $interp
让Tk窗口显示在不同的 DISPLAY 上
$ DISPLAY="" tclsh % package require Tk # couldn't connect to display "" % interp create a % a eval {set argv {-display :0}; package require Tk} # A window pops up on display :0 % interp create b % b eval {set argv {-display :1}; package require Tk} # A window pops up on display :1