官方下載的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中讀取,所以會顯示亂碼,不知道是否有方法可以解決此問題?
匿名 | 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"
匿名 | 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::是可以直接處理...
匿名 | 2014年4月16日 上午10:07
我猜想,你包成tclkit的時候,Tcl直譯器使用的編碼系統可能是utf-8,或是說::ini::預設是以utf-8在處理檔案的
如果是我的話,可能會把自己的程式,還有test.ini都用utf-8的方式編碼,這樣應該比較不會出問題。
Unknown | 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]目錄的哪個位置呢?
謝謝!
匿名 | 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載入程式
匿名 | 2014年8月27日 上午10:57
忘了說
set appPath [file normalize [info script]]
要放在你的主腳本中,也記得先用puts $appPath來查看「一般情況執行」及「在tclkit中執行」的差異。
Unknown | 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的呢?
謝謝!祝週末愉快。
匿名 | 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:/執行
Unknown | 2014年9月2日 上午9:36
謝謝您這麼詳細的回復。原來這個問題的關鍵,是要告訴程序如何正確處理路徑。我這幾天會抽時間按照您的方式試試。在還沒有徹底弄懂之前,我發現還有一個很笨的方法,就是將支援文件的代碼統統複製到主腳本去。這樣只需要打包一個主腳本文件就好了。我知道這是權宜之計,最終還是要弄懂的。再次感謝您的指教。
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 掉了?
留下您的意見