#

官方下載的tclkit可能沒有包big5的編碼或一些常用的tcl套件,如果想要把big5的編碼加進去或是包一些額外的套件,這時就需要修改官網下載的tclkit了。

建立支援其它編碼的tclkit

以下是大概的步驟。首先,你需要先下載tclkit及sdx.kit,個人比較喜歡在Google Code的tclkit的專案下載。下載完成後你需要先複製一份tclkit,假設我下載的是linux版的tclkit-8.5.8還有sdx-20090202.kit。我會把這兩個檔案放在同一個資料夾,然後把sdx-20090202.kit重新命名為sdx.kit。然後把tclkit8.5.8複製一份命名為tclkit,所以現在總共有3個檔案,分別是:

  • tclkit
  • tclkit-8.5.8
  • sdx.kit

下一步,我要把tclkit-8.5.8裡的資料抽取出來,先切到放tclkit的目錄,然後用下列的命令:


./tclkit sdx.kit unwrap tclkit-8.5.8


執行完後,你在目前的目錄下應該會發現多了一個tclkit-8.5.vfs的資料夾,你只要把你想要的包進去的編碼複製到下面的資料夾裡:


./tclkit-8.5.vfs/lib/tcl8.5/encoding


把想要增加的package複製到下都的資料夾:


./tclkit-8.5.vfs/lib


然後再重新打包。打包的命令是:


./tclkit sdx.kit wrap my-tclkit-8.5.8 -vfs tclkit-8.5.vfs -runtime tclkit-8.5.8


這樣一個你自己的客製tclkit就完成了。

注意哦!! 你可以在本機Tcl的安裝目錄下複製那些你想要加入tclkit的編碼檔或是package。

用tclkit打包含big5編碼的程式檔

正常的情況採用big5編碼的程式檔,如果直接包成starpack,這樣可能會讓程式執行產生中文亂碼。這是因為tclkit預設是以utf-8編碼來載入你的程式的關系,如果想要解決這個問題,可以用下面的方法:

step1.先建立一個用來打包的資料夾假設叫 "myApp.vfs"
step2.把你寫的tcl程式放在裡面假設主程式叫 app.tcl
step3.在myApp.vfs的資料夾裡建立一個main.tcl內容如下:



step4.打包執行檔

./tclkit sdx.kit wrap myApp -vfs myApp.vfs -runtime tclkit-8.5.8

如果一來你自己包的執行檔就不會發生亂碼了。

39 個意見

Jet.Huang | 2009年6月4日 下午5:23

你好~最近在學習TCL,剛好看到大大你如此用心的維護這網站,跟著大大的一步步學習也漸漸的學會了些皮毛,但是無奈為什麼都不能讓輸出視窗顯示出中文,都是亂碼,你此篇的敘述我不太明白,我是用x86的tcl.請大大幫幫忙一下..

Dai | 2009年6月4日 下午10:47

hi...我新寫了一篇關於中文亂碼的文章,希望對你的問題有幫助。請按這裡

Benson | 2009年11月17日 下午7:51

您好
看到這裡發現真的一切教學都很實用,但是
有沒有關於 Tcl 搭配 mysql 資料庫上傳
與新增、刪除、修改等教學可以教我們...
謝謝

Dai | 2009年11月17日 下午11:16

這些內容我打算放在進階篇,所以應該還要等一段時間等我把基礎篇整理好,才會動手.

Benson | 2009年11月18日 上午11:02

謝謝回覆
另外一個小問題,我目前用Tcl8.4.xx來做
自動測試的程式,但想換成Tcl8.5.xx的版本,所以想請問一下,Tcl8.5.xx穩定嗎?
我一直聽一些前輩說8.4.xx才是最穩定的,
而8.5.xx還不很穩定是真的嗎?
謝謝

Dai | 2009年11月18日 下午6:08

8.5.6以前真的用起來有些問題,8.5.7以後就好多了,在我的使用狀況上8.5.7還滿ok的。

翊翾 | 2010年1月25日 下午6:19

Dai你好^^~
請問我打包後的圖示想要改變成我想要的圖示
所以我拆開tclkit.tail後把裡面的.ico換成我要的圖示
但最後我再把它包起來卻沒有換成我想要的圖示

請問Dai這要怎麼解決呢~

dai | 2010年1月25日 下午7:42

hi 翊翾

我都用 resourcehacker 這個程式來改圖示。

細節的做法可以參考Custom Icons For Win32 Starpacks

TerryWang | 2010年2月4日 下午4:57

D大...感謝昨日回答的問題...我已成功解決囉!! ^^

想問的是..我目前打包程式為.exe檔..遇到問題

程式中menu的各名稱我使用中文..導致我打包出來後

menu上的名稱都變成亂碼了...請問是否有辦法可以

完整呈現中文呢??


p.s 順便恭喜D大的網站越來越周全了..而且一起研究TCL的人也多了!!^^

TerryWang | 2010年2月4日 下午7:09

D大再問一個問題...ORZ

若我想做出在menu中選擇font...跳出字型選擇的視窗..

該如何做出呢??

dai | 2010年2月4日 下午9:35

TerryWang請參考Q3.重新包裝tclkit的後半段,來解決starpack中文亂碼的問題,

字型選擇視窗的話可以用BWidget的SelectFont命令。

lbboy | 2010年3月12日 下午9:11

請問一下 有關tcom ,還有starpack , access excel file 相關的問題

我有一個tcl 內容是讀excel file的內容, 並puts 出來, 但是打包成kit file 確無法正常運作

在tcl inter-active mode時用tclsh 去執行 .tcl 時,有正常的打開excel file 並puts out 內容

後來想要打包成單一檔案
先在.vfs/lib/ 中下加入tcom package
再利用tclkit sdx.kit wrap mykit -vfs xxx.vfs 打包成 kit file後
用tclkit mykit 執行 , 但是卻不會輸入excel file 內容

不知道是何原因 , 與tclkit 內含的tclsh 有關嗎??
還是應該要怎麼樣 才能將有用到tcom package 的tcl file 打包成單一file or kit file呢??

感謝 感謝

米粒 | 2011年4月1日 下午12:01

我遇到一個問題@@
在用ezdit打包成執行檔時,打包沒問題…
但要執行打包後的執行檔卻出現,似乎是tmpkit.tcl有問題…我是在ubuntu下執行的,請問大大有遇過類似的情形嗎?

invalid command name "button"
while executing
"button .btnok -text "ok" -command {exit}"
(file "/home/oknow/main.bin/lib/app-tmpkit/tmpkit.tcl" line 3)
invoked from within
"source /home/oknow/main.bin/lib/app-tmpkit/tmpkit.tcl"
("package ifneeded app-tmpkit 1.0" script)
invoked from within
"package require app-tmpkit"
(file "/home/oknow/main.bin/main.tcl" line 4)

簡單的程式如下:
button .btnok -text "ok" -command {exit}
pack .btnok
感恩~~

dai | 2011年4月2日 上午8:48

明利,

你的頭鬼啦!! 還大大咧...

我猜你應該是用 tclkitsh 而不是 tclkit 來打包starpack

注意tclkitsh是沒有包含Tk的

如果你確定是用tclkit,那試試在程式的第一行加入

package require Tk

米粒 | 2011年4月6日 下午7:40

請教問題不是都要稱呼大大嗎?~哈
我又遇到下面問題了…打包成windows執行檔真厚功…

1.因為我只有一個tcl檔,但下面要放什麼…
包進去的編碼複製到下面的資料夾裡:←是指自製程式的語系檔嗎?
./tclkit-8.5.vfs/lib/tcl8.5/encoding
把想要增加的package複製到下都的資料夾:←是指圖片之類的嗎?
./tclkit-8.5.vfs/lib

2.這段的用意是 ./tclkit sdx.kit wrap myApp -vfs myApp.vfs -runtime tclkit-8.5.8
這個會產生編碼後的myApp檔
再把這個檔重新包裝成執行檔的意思嗎?

0rz謝謝指教

dai | 2011年4月10日 下午1:41

米粒,

我下星期放假,到時台南見,再跟你說怎麼玩tclkit.

米粒 | 2011年4月14日 下午10:33

啊大.

我16-17大部份都在高雄

23-24才都會在台南@@

那時再一起聚餐吧~

匿名 | 2011年9月22日 下午2:53

Dai大,
我打包還是有點問題~~
我在Google Code的tclkit的專案下載了
1. sdx-20110317.kit
2. tclkit-8.5.8-win32.upx.exe
在Win7(32位元)下commandline "tclkit sdx.kit unwrap tclkit-8.5.8"
會有error視窗,不過也新增了tclkit-8.5.vfs資料夾(裡面都是空的)
我還是看不懂怎麼打包~~可否請Dai大說明一下~~感溫

dai | 2011年9月22日 下午9:03

這可能是因為你的tclkit有壓縮過的關係。

tclkit-8.5.8-win32.upx.exe <==這邊的.upx指的是用 upx 的工具壓過

所以請先到 : http://upx.sourceforge.net/ 下載upx的壓縮工具 先把tclkit解壓

然後再試試用sdx.kit unwrap你的tclkit應該就可以了

匿名 | 2011年9月23日 下午6:40

謝Dai大說明~~
不過我下載的tclkit-8.5.8-win32.upx.exe
我下載的upx解壓縮後~~也沒看到什麼東西耶~~
可以解釋一下嗎~~甘溫

dai | 2011年9月23日 下午8:13

剛試了一下,沒有用upx解壓縮一樣可以把tclkit-8.5.8-win32.upx.exe 解開

我把 tclkit-8.5.8-win32.upx.exe 及 sdx-20110317.kit 都放在 d:\ 下面

然後複製一份 tclkit-8.5.8-win32.upx.exe 並改名字 tclkit.exe

也把 sdx-20110317.kit 改名字成 sdx.kit

接下來 執行 下面的命令就解開了

D:\> tclkit.exe sdx.kit unwrap tclkit-8.5.8-win32.upx.exe

在想說會不會是你的 tclkit-8.5.8-win32.upx.exe 放在一個有包含 中文路徑 或 非英文字 的路徑下面

所以解不出東西??

匿名 | 2011年9月23日 下午9:15

感謝Dai大~~按照你的做法這是OK的~~
可能我把檔案放在桌面上,有中文路徑,所以才造成這問題~~
感謝感謝~~

匿名 | 2011年9月25日 下午8:30

Dai大,再請教你一個打包的問題
用tclkit打包含big5編碼的程式檔(文章有說明)
source -encoding big5 [file join $appPath app.tcl]
source [file join $appPath app.tcl]
這兩個都可打包成功,但是用 -encoding big5打包後,無法執行耶
訊息是 Error in startup script
unknown encoding big5 while executing source -encoding big5 [...]
可否幫忙解釋一下,還是說我少了什麼步驟 ?

dai | 2011年9月25日 下午10:28

你可能忘了把big5.enc複製到下面的資料夾

tclkit-8.5.8.vfs/lib/tcl8.5/encoding

big5.enc可以在 C:\Tcl\lib\tcl8.x\encoding 裡找到

匿名 | 2011年9月26日 下午9:37

感謝 Dai大~~解決了~~感溫!!!

TerryWang | 2014年4月14日 上午11:39

Dai大..好久不見啊...
有個包exe的問題想請問一下!!

我做了一個包含中文的程式...我利用您的教學成功將視窗的顯示文字都正常顯示big5, 但遇到以下問題
我的button上顯示文字是去讀取ini file, 但包好exe之後, 其他該顯示中文的地方都正常顯示中文..唯獨按鈕由於是從ini file中讀取,所以會顯示亂碼,不知道是否有方法可以解決此問題?

dai | 2014年4月14日 下午3:45

嗯 ~ 應該是讀ini的時候沒有設定好encoding的關系,可能要這樣
set fd [open xxx.ini r]
chan fconfigure $fd -encoding "這邊要設定xxx.ini檔案的編碼"

然後....以下是處理ini檔案的程式

TerryWang | 2014年4月14日 下午5:20

Dear Dai大...
我還是失敗了...附上我的code..幫忙看一下囉!!
set ROOTPATH [pwd]
set inifd [::ini::open [file join $::ROOTPATH "test.ini"] r+]
puts $inifd ............................................................................ini0
chan configure $inifd -encoding big5 .......................................在這裡會出現錯誤can not find channel named "ini0"

dai | 2014年4月15日 上午10:14

嗯 ~ 你的 $inifd 儲存的應該不是一個常規的 file channel ~
這樣好了,你先幫我確定一下在開啟 test.ini之前執行下面的命令
puts [encoding system]
看是 big5 還是 utf-8 ?

TerryWang | 2014年4月15日 上午11:23

Dear Dai,
puts [encoding system]
會顯示cp950

TerryWang | 2014年4月15日 上午11:38

不過我不太懂什麼叫做不是一個常規的file channel ?
我打開ini的方式是根據tcl help文件中的教學
::ini::open file ?access?
::ini::close ini
::ini::commit ini
::ini::revert ini
::ini::filename ini
::ini::sections ini
::ini::keys ini section
::ini::get ini section
::ini::exists ini section ?key?
::ini::value ini section key ?default?
::ini::set ini section key value
::ini::delete ini section ?key?
::ini::comment ini section ?key? ?text?
::ini::commentchar ?char?

我猜是因為這個原因...因為如果用您之前提供的set fd [open xxx.ini r]...是可以的,只是變成我程式後來要讀取ini某一塊文字時候要再處理過,
如果是用::ini::是可以直接處理...

dai | 2014年4月16日 上午10:07

我猜想,你包成tclkit的時候,Tcl直譯器使用的編碼系統可能是utf-8,或是說::ini::預設是以utf-8在處理檔案的
如果是我的話,可能會把自己的程式,還有test.ini都用utf-8的方式編碼,這樣應該比較不會出問題。

cheng wang | 2014年8月27日 上午9:35

Hi Dai,
我又來麻煩您了。如果我想把tcl主腳本調用的腳本也一併打包進EXE,該如何操作呢?
例如:
當前編寫好的腳本目錄下有main.tcl和[source]目錄;[source]目錄里又包含了main.tcl所依賴的proc.tcl腳本。
main.tcl在運行時,首先會用source -encoding utf-8 source/proc.tcl來載入proc.tcl腳本,如果按照本篇文字介紹的方法,我應該將proc.tcl放[main.vfs]目錄的哪個位置呢?
謝謝!

dai | 2014年8月27日 上午10:55

這個問題的重點在於,要如果找到主腳本mail.tcl執行時的位置?

你可以試試用下面的程式找到mail.tcl執行時的位置:

set appPath [file normalize [info script]]

上面的一行程式在「一般情況執行」跟「在tclkit中執行」結果是不一樣的

你可以依情況配合 file join 及$appPath組出 source/proc.tcl 的檔案位置,然後再執行 source 把proc.tcl載入程式

dai | 2014年8月27日 上午10:57

忘了說

set appPath [file normalize [info script]]

要放在你的主腳本中,也記得先用puts $appPath來查看「一般情況執行」及「在tclkit中執行」的差異。

cheng wang | 2014年8月30日 下午5:31

Hi Dai,
感謝您的回復。這幾天不知何故一直無法正常顯示您部落格的評論框,直到今天才恢復。耽誤了回復,請見諒。

我在puts $appPath之後,在【一般情況】和【tclkit環境】秀出來的都是main.tcl當前所處路徑。
其實我這個問題的初衷,就是想把主腳本和與之相關的支援文件都打包進一個EXE文件,然後只發送這一個獨立的EXE文件給用戶即可,EXE無論放在哪個目錄下都可執行。類似您的很讚的ezdit程序,她是一個單獨的EXE文件,無論我把她放在哪個目錄都能正常運行。這樣就可迴避source proc.tcl等支援文件路徑的問題。

我當前按照本篇文字的介紹操作后,main.tcl主腳本目錄下會生成main.exe程序(我的理解main.exe==tclkit.exe+main.tcl)。只要[source]目錄和main.exe文件在同一個目錄下,程序能夠正常運行;但只要main.exe和[source]目錄不在同一個目錄下,就會提示找不到source/proc.tcl。

所以我最終的目的是也想將我的程序打包成ezdit那樣的獨立EXE文件。不知道您是怎麼打包ezdit的呢?

謝謝!祝週末愉快。

dai | 2014年8月31日 下午12:08

假設 main.tcl 放在 d:\

main.tcl的內容如下:

console show
update
set appPath [file normalize [info script]]
puts $appPath

在「一般」即「source code」情況下 上一行的執行結果應該是 「d:/main.tcl」

若用包裝成main.exe執行的結果可能會類似「D:/main.exe/lib/app-main/main.tcl」 <== 這個路徑會跟據 tclkit+sdx的版本而有所不同

我的方法是這樣:

app.vfs (這是要打包app.exe的資料夾, 也是你放source code的資料夾,裡面放了以下2個檔案)
- main.tcl
- _app_root_ (這一個空白的檔案,用別的名稱或是檔案也沒關系,但要有獨特性,在包裝起來的exe中不要有其它地方出現這個名字)

在main.tcl 執行的時候先去找出 _app_root_ 這個檔案的資料夾位置(appRoot),以剛剛的例子來說:

若由 $appPath 開始用迴圈一直往上層資料夾找會有以下的結果

1. 「一般情況」appRoot 的結果是 「d:/app.vfs」
2. 「tclkit環境」appRoot 的結果是 「d:/app.exe」
3. 然後可以配合 [namespace exists ::starkit] 的結果去判別,現在是不是在starkit中執行

有了上面的3個條件 可以找到所有包在 starkit 中的資料夾及檔案, 也可以找到沒有包在app.exe的資料夾及檔案

ex.

puts [file join $appRoot abc.txt] 不管是在main.tcl及app.exe的情況都會找到和 main.tcl 同一層位置的 abc.txt ,可能的情況是

1. d:/app.vfs/a.txt
2. d:/app.exe/a.txt (可以用 open, source 對它操作)

配合 [namespace exists ::starkit] 及 「file dirname $appRoot」 也可以找出 app.exe 是在d:/執行

cheng wang | 2014年9月2日 上午9:36

謝謝您這麼詳細的回復。原來這個問題的關鍵,是要告訴程序如何正確處理路徑。我這幾天會抽時間按照您的方式試試。在還沒有徹底弄懂之前,我發現還有一個很笨的方法,就是將支援文件的代碼統統複製到主腳本去。這樣只需要打包一個主腳本文件就好了。我知道這是權宜之計,最終還是要弄懂的。再次感謝您的指教。

Hu Mike | 2015年2月3日 下午3:24

又來請教一下 Dai 大大,我這邊遇到一個打包的問題,不知道是不是和image格式有關?
set wm_logo [image create photo -file Logo.png]
wm iconphoto . $wm_logo
我想要載入程式的logo,打包前用wish在ubuntu下執行沒有問題,但是我用tclkit 8.5.9打包後就出現錯誤
couldn't recognize data in image "Logo.png"
就算加入package require img::png還是一樣有問題,而且連原本wish都不能執行,說can't find package.
請問這是 tclkit 的問題,還是我有什麼東西 miss 掉了?

留下您的意見

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates