同时运行多个Tk解释器

@ 2009-07-19 14:57:40
标签:

    # 2008/12/09 03:19 @ Sean Zhang

    这个问题其实有多个表述方式:

    • Using Tk as a loadable package (Tk作为一个扩展包)
    • Using Tk in slave interpreter (在子解释器重使用Tk)
    • 同时拥有多个 Tk 顶级窗口

    关于这个问题的灵感来自于自己的一个项目。这个项目中,希望可以用一个新的顶级窗口(.)加载第三方Tk应用程序。

    [[http://wiki.tcl.tk/2437|Using Tk as a loadable package]] 给出了可能的办法。

    package require

    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]
    

    load

    # 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
    

    static load

    上面的办法需要知道相应的 .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
    

    标签:

      分享到:
      comments powered by Disqus

      28/32ms