#

如果您有任何關於Tcl的問題或是想法,歡迎在這邊和大家一起討論分享。

208 個意見

«最舊   ‹較舊   1 – 200 (共 208 個)   較新›   最新»

dai | 2010年7月6日 下午9:25

Hi eda,

你的提議我很有興趣,而且我自己也很寫

只是現在的時間不太允許,也許要等以後比較多時間才投入吧

michael | 2010年7月19日 下午6:03

想請問一下如果己開的file,修改後想要覆蓋原檔案要如何做.

sam | 2010年7月21日 下午1:57

Hi michael:

set fd [open C:\\a.txt w+]
puts $fd "輸出到檔案....."
close $fd
set fd [open C:\\a.txt w+]
puts $fd "覆蓋吧....."
close $fd

w+與其它參數的使用請參照Dai教學文件第11章:Tcl - 檔案I/O

sam | 2010年7月22日 上午8:33

Hi michael:

我想了一下這一句有點怪怪滴 ---> "修改後想要覆蓋原檔案"
一般來說修改後檔案不就為你所要的檔案,應該不用再覆蓋一次。
還是說我誤解你的意思了呢,或者你是指copy的覆蓋?

Michael Lee | 2010年7月26日 下午4:59

Hi 你好!我又有一個問題,想請教你了.
我想在tclsh下執行 linux command,但一直無法成功.例子如下
exec "htpasswd -b .htpasswd username password"
不好意思要麻煩你指導一下.謝謝!

匿名 | 2010年11月2日 上午11:20

你好:

想請教個問題,我想在 tcl8.2 中使用 tbcload17.dll
但會有以下的錯誤訊息
% load "c:/tcl/lib/tcl8.5/tbcload1.7/tbcload17.dll"
version conflict for package "Tcl": have 8.2, need 8.5a7
%
請問如何讓 tbcload17.dll 可以在 tcl8.2 中使用呢?
由於我所使用的 tcl8.2 版本無法升級
不知道是否有解決的方法?謝謝

Sam Huang
Mail: samhuangx@hotmail.com

dai | 2010年11月7日 上午8:58

hello

嗯~我沒有用過tbcload,所以實際的狀況我也不了解

但如果是我的話,我會找tbcload的source然後重新編譯for tcl8.2的版本。

匿名 | 2010年11月9日 上午10:01

Hi 您好:

想請問有辦法在tcl 8.4 運行::ttk嗎?
因為無法升級成tcl 8.5的版本
謝謝~

吉米 | 2010年11月11日 上午12:25

各位好
我在使用ttk::treeview時遇到一些問題
我用treeview搭配scrollbar,y軸沒問題
但是x軸有些問題,當我的資料變寬,超過treeview,但是x軸依然無法捲動
後來發現x軸是跟著tree column #0 的寬度而改變的
但是當我的文字寬度超過這個寬度時,treeview沒改變這個寬度
不知道有沒有指令可以讓xolumn的寬度自動改變
還是說我只能自己寫個副程式來做這件事
謝謝

dai | 2010年11月20日 上午9:49

如果tcl8.4要使用tile (ttk) 的話,那你需要額外安裝給tcl8.4版用title的套件

dai | 2010年11月20日 上午11:08

hi吉米
treeview的欄位長度是不會自動跟隨Item的長度後改變的
也許你可以使用功能更強的TkTreeCtrl

吉米 | 2010年11月20日 下午11:43

感謝
我試了3種這種階層式的視窗原件,treeview Tree treectrl
Tree和treectrl會隨item長度自動改變欄位寬度,
但是用Tree在建樹會花比較長的時間,不知道是不是我程式的問題
我的item大約5000多
目前是採用treectrl的方法
關於這個原件我有個疑問
被選取到的item可以自動反白嗎? 我目前是用bind的方式去改變element的顏色

吉米 | 2010年11月21日 下午2:37

自問自答一下
treectrl裡的element很多參數可以設定不同狀態時用不同的參數值
下面這行會建立一個element被選取到時是灰色預設值是白色
$T element create elemBorder rect -fill { gray {selected focus} white {}}
不過我還不知道要去哪裡找這些element的狀態,目前都是看範例如何使用

匿名 | 2010年11月23日 下午3:18

Hello Dai

我想請問一個用法,
在一個frame or labelframe裡有許多的row
而每一個row會由text,entry,button所組成
我想藉由移動y scrollbar來看到每一個row的element
移動x scrollbar來看到frame的column
我試過許多方法,似乎都沒有快速又有效的方法,
Thanks in advance.

匿名 | 2010年11月26日 下午11:00

dai您好...
我剛上手不久,我的平台是ubuntu 10.10 用ezdit寫的一個簡單的數字相加的圖型介面...
但我不知道要怎麼打包成一個執行檔...
在linux下,可以教我如何打包嗎?我一直試不成功= =
如要打包成win下的執行檔,又要如何做呢???
謝謝~~~

剛剛有發一個在您的教學文章裡的"字串處理"好像不大對,改發在這裡,不好意思

dai | 2010年11月30日 下午12:46

給吉米: 在tktreectrl的文件裡有一個章節是「STATES」,裡面可以找到element可用的狀態哦。

給上上個匿名: 如果你要可以捲動的frame,我會考慮使用tablelist,treectrl或是BWidget的ScrollableFrame來做。

給上一個匿名: 請參考這件starkit的文件來打包單一可執行檔。

TerryWang | 2010年12月3日 下午4:51

Dai大..許久沒來留言請教, 知道您目前在當兵..一切加油啊!!

想問個問題..困惑許久...

假設我讀取某資料後..資料為數行, 我想要幫每一行前頭加上編號,用以區分他是第幾行
該如何做呢?

ex :
aaaa
bbbb
cccc
dddd

想變成
1.aaaa
2.bbbb
3.cccc
4.bbbb

能的話是否能自動根據行數來增加編號呢??

dai | 2010年12月3日 下午6:02

Hi TerryWang 真的好久沒看到你了呢...

請試試下面的程式:

set data {aaaa
bbbb
cccc
dddd}

set i 0
foreach {item} [split $data "\n"] {
incr i
puts $i.$item
}

匿名 | 2010年12月4日 上午7:34

Dai 您好...
在linux終端機下
wget http://abc/abc.txt -O xyz.txt
可以下載一個文字檔,名稱為xyz.txt
那程式要怎麼打呢...?

匿名 | 2010年12月4日 上午7:44

Dai 您好
再想問一下
我參考您的starkit的文件來打包單一執行檔是可以執行...非常感謝
在Linux下打包給Linux下可以執行
在Win下打包給Win下可以執行...
那可以在Linux下打包給Win下執行嗎???那要如何做呢???

dai | 2010年12月4日 上午10:35

在Tcl裡要實現像wget抓網頁的功能可以用http套件例如:

package require http

set tok [http::geturl http://blog.got7.org]

set fd [open d:/got7.html w]
puts $fd [http::data $tok]
close $fd

http::cleanup $tok

這個程式假設抓網頁的過程不會出錯

dai | 2010年12月4日 上午10:41

在Linux下打包給Windows執行的starpack是可以的,例如:

$tclkit sdx.kit wrap app.exe -vfs app.vfs -runtime tclkit.exe

這邊的重點是-runtime後面要指定windows系統可以執行的tclkit

匿名 | 2010年12月4日 下午10:53

謝謝Dai

吉米 | 2010年12月12日 下午3:39

Dai你好
我用tclkit打包
再用resource hacker這套軟體修改icon
但試改完之後程式會變成無法執行
不知道是不是要另外做什麼設定

dai | 2010年12月12日 下午6:03

hi 吉米

這有可能是因為,你的tclkit有用upx壓縮過

你需要先用upx把tclkit解壓後,再用resource hacker修icon

另外,有些tclkit裡的文字訊息是不能亂改的

如果沒改好也會讓原來的程式變成無法執行

吉米 | 2010年12月12日 下午7:04

感謝

果然是被壓過了,解完再換圖就能執行了

另外,剛剛找到另一種打包方法可以一開始就包出自己的icon
http://www.equi4.com/wikis/equi4/267
稍微試了一下,似乎要把自己的icon和所用的tclkit icon格式完全相同
才能替換

WPL | 2011年3月12日 上午2:25

Dai大大您好:

請教您,使用teacup install 下載套件,在哪個網站可知下載所需要的套件?使用套件的方法是在套件的哪份文件有說明呢?謝謝!

dai | 2011年3月13日 上午8:42

hi WPL,
你可以用 teacup search 來尋找你想安裝的套件,至於套件的說明文件,我大多是去套件的官方網站,不然就是是tcler's wiki裡找。

小白 | 2011年4月7日 下午7:50

請問Dai
tablelist內的combobox的問題
想和一般的combobox一樣 bind .a << SelectCombobox>> {} 不知道行不行?

目前遇到的問題,tablelist的combobox選擇完後,我程式要執行時一定要案enter
或是點選表格其他空白處,去觸發editendcommand,如果我單純按GO
程式就會說找不到這個值(沒給default),不知道Dai大有沒有辦法幫忙解決><? 3QQ

吉米 | 2011年6月9日 上午12:47

您好
想詢問一個關於把C++程式製作成tcl用的dll檔問題
通常我都用以下2種方式取出回傳值
Tcl_AppendResult(tclInterp,buf,NULL);
sprintf(tclInterp->result, "%s\n", buf);
對於希望輸出結果是字串加一些變數的副程式這兩種就夠用了
但現在遇到一個比較麻煩的副程式
void print_oid_report(FILE * fp);
實際應用時是輸出到stdout
print_oid_report(stdout);
不知道有沒有什麼比較方便的方法可以把結果導給tcl

dai | 2011年6月14日 下午8:09

hi 吉米

請試試把stdout導到你可以掌控的file channel裡。

最近在搬家回得晚 sorry~

吉米 | 2011年6月15日 上午2:25

您好

所以說最快的方式還是要開一個檔案來放結果囉
tcl裡的c library 有關file channel的function我看不懂是如何應用
現在做法是直接宣告一個一樣形態的變數 FILE *fp
直接用 fopen 開一個檔案,執行完print_oid_report(fp)後
再開一次檔案把值讀回來,要多作一次工

謝謝

MEOW! | 2011年8月15日 上午12:40

您好

最近想從Perl轉換到Tcl語言看看
請問您Tcl打包成exe是使用Tcl Dev Kit嗎?

另外Tcl在使用tk、socket是否可以直接使用而不需額外安裝套件?
(Perl需要額外安裝模組並且use, 所以教學中Tcl直接使用讓我非常驚訝XD)

dai | 2011年8月15日 下午7:18

hi MEOW,

在Tcl常用tclkit還有freewrap把程式打包成單一可執行檔(綠色的.exe檔)。

參考這個網址 : http://wiki.tcl.tk/52

Tcl內建socket的功能,所以不需要額外安裝。

dai

MEOW! | 2011年8月15日 下午11:37

您好

感謝您這麼快就回覆
Tcl比我想像中的還要強大威猛呢!
加上Tcltk之後真是太有趣了=w=

現在完全是初生之犢
以後還請多多指教喔^^

dai | 2011年8月17日 下午1:18

hi MEOW,

別客氣有空可以多多交流。


dai

匿名 | 2011年8月17日 下午3:32

Dai 大大您好
我用某個商業軟體,有內建支援tcl 8.4
前段時間有試著由您的教學檔案,寫些自動化的工具。
最近想在寫點東西,但遇到瓶頸,
1.是否可用tcl訪問ftp站台,包含:上傳下載檔案、取得遠端資料夾、檔案的list資料等等
2.如果需要安裝額外的PACKAGE,我該如何操作? 因為tcl是內建在該軟體內,我該如何load一個需要的package

再次感激您分享的教學,讓我真的受益良多!!

dai | 2011年8月18日 上午2:44

你可以裝tcllib它是純tcl的script

http://sourceforge.net/projects/tcllib/files/tcllib/1.13/

下載後解壓在tcl預設的library資料夾裡。ex. c:\tcl\lib

然後參考下面的說明:

http://tcllib.sourceforge.net/doc/ftp.html

http://tcllib.sourceforge.net/doc/ftp_geturl.html

翊翾 | 2011年10月25日 上午9:29

Dai你好,好久沒來發問,想問個蠢問題

我利用socket去開啟一個telnet的連結
當我在通道裡一來一回溝通時,發現我收到的字串在cmd底下是正常的
但是我把字串印到記事本裡卻會出現奇怪的符號
Ex: set a [read $fd]
puts $a 會得到=> AAA
但是我另外開一個記事本把$a寫道裡面去
set fd1 [open a.txt w+]
puts $fd1 $a
close $fd1
在打開記事本卻變成=> AAA AAA
中間那串空白在notepad++裡面會到看到AAABCBCBCBCBC...AAA
不知道Dai是否有遇過這問題,能解決嗎?

dai | 2011年10月25日 下午3:51

嗯 ~ 會不會是編碼出了問題??

例如說: 你的telnet server 是用utf-8或是其它的編碼來傳送命令,但你在windows下執行Tcl程式(用big5模式) ~ 所以出了問題。

當然也有可能是你的$fd用binary模式來傳送資料!! 這可能要多一次utf-8或是big5的轉換動作!!

請參考Tcl的encoding命令~來轉換編碼!! 祝你成功!!

對了!! 成功的話 可以跟我分享一下經驗嗎?

瘋狂伊凡 | 2011年11月1日 上午10:34

Hi, Dai大
可以說明一下, Tk和wish的差異嗎?
Tk是不是應該就是tclsh的圖形化介面, 那wish要有命令提示字元就必須下console show的命令,我說的正確嗎?
不好意思,如果問題問的牛頭馬嘴,就請你見諒,再麻煩你指正一下
因為是新手,但是對Tcl越來越有興趣,所以會繼續學習下去
如果遇到不懂的,還需要Dai大再多多幫忙^^
大大感謝!!

dai | 2011年11月1日 上午11:51

嗯~簡單的說

wish = tclsh + Tk

匿名 | 2011年11月23日 上午9:36

Dai你好

首先感謝你提供的教學內容讓我受益良多~
這邊有個問題想請教你~
我想要做一個Load(Save)Profile 的功能
也就是說,有需多ckeckbutton讓使用者選擇~
當使用者選擇完成後可以按下 "Save Profile"
之後使用者如果想要選擇一樣的項目只要按下"Load Profile"就可以把當初的選擇叫出~
Dia大大~請給我點意見吧~小弟感激不盡~!

dai | 2011年11月23日 下午1:23

其實方法很多,下面是一個簡單的例子,記些簡單的東西ok!!

set ::chk1 "tcl"
set ::chk2 ""
pack [ttk::checkbutton .chk1 -text "喜歡Tcl" -variable ::chk1 -onvalue "tcl" -offvalue ""] -side top -fill x -padx 3 -pady 3
pack [ttk::checkbutton .chk2 -text "喜歡Python" -variable ::chk2 -onvalue "python" -offvalue ""] -side top -fill x -padx 3 -pady 3
pack [button .btn1 -text "save" -command {
set fd [open "c:/a.txt" w]
puts $fd [format {set ::chk1 "%s"} $::chk1]
puts $fd [format {set ::chk2 "%s"} $::chk2]
close $fd
}] -side top -fill x -padx 3 -pady 3
pack [button .btn2 -text "load" -command {
source -encoding utf-8 "c:/a.txt"
}] -side top -fill x -padx 3 -pady 3

匿名 | 2011年11月23日 下午2:52

Hi dai
謝謝你的寶貴意見
另外請問一下~
TCL能做到跟windows一樣,可以選擇save的路徑與檔名嗎?

dai | 2011年11月23日 下午3:36

這個當然 ~ 請參考教學文件第37篇 , 裡面有教學!!

小燕鷗 | 2011年12月8日 上午11:10

Hello,Dai
不曉得你有沒有在Linux上使用tcllib的經驗?
我所遇到的狀況是:我平常習慣在Solaris上寫tcl程式,最近寫了一些跟網路有關會用到tcllib的程式,
在Solaris上都執行很正常,但是拿到Linux上就是反應不對。

例如tcllib的ftp client程式,ftp的channel id都拿到了,但是就是不能切換目錄跟mget程式。
今天剛寫了一隻上傳html格式郵件的程式,用到::smtp::sendmessage跟mime的函式。
Solaris上執行起來一切正常,但是拿到Linux上後,程式看起來執行沒有錯誤訊息,
但是信沒收到,檢查系統的mail log裡面也沒有紀錄。整個就很詭異。

本來懷疑是tcl在Linux的64bit函式庫有問題,後來我重編tcl並加上--disable-64bit,也檢查
了gcc在編譯時的參數,確實沒有-m64。但程式還是沒有正常。
這讓我非常頭痛。不曉得你有沒有遇過Tcl程式在Linux上有問題的經驗跟處理方式?
謝謝。

匿名 | 2011年12月29日 上午9:07

請問dai大大,
TCL是不是有類似timer功能,我想要每4個小時自動執行某段程式,持續一個月

dai | 2011年12月29日 下午9:02

請參考Tcl的after命令

http://wiki.tcl.tk/808

你可以透過after命令週期性的執行 script

NightGenie | 2011年12月30日 上午9:36

Hi Dai 您好:
有個關於監控com port的程式想請教一下,首先說明一下我的目的,
我有個router產品需要去監控他的開關機狀態,
因為有時開機會失敗,所以我需要監控com port去看某個字串,判斷router是否已經開完機了,
以下是我在網路上找到的範例,可問題是如果我router沒開機則com port會連線失敗,
這樣我就無法抓到從一開始開機到完成的log.
可為什麼用XP的超級終端機程式去連線com port都不會有這問題,


package require Expect

proc GetData {channel} {
if {[gets $channel line] > 0} {
puts $line
}
}

set channel [open COM1: RDWR]
fconfigure $channel -mode 115200,n,8,1 -blocking 0 -buffering line
fileevent $channel readable [list GetData $channel]

vwait forever

dai | 2011年12月30日 上午10:30

hi NightGenie ,

嗯 ~ 正常情況下,這個程式不會有問題,除非你的COM1被其它程式佔用,ex..你的這個程式跑兩次就有可能會發生。

你可以用工作管理員,查看一下有沒有tclsh.exe或是wish.exe佔在系統裡沒有被結束。

另外 package require Expect 如果只是跑上面的程式,它可以拿掉。

祝 ~ 成功

NightGenie | 2011年12月30日 上午11:41

Dai大:
我看過了工作管理員只有一個tclsh86.exe在跑而已,
我還是只能在有上電的時候再執行程式才正常,
如果是斷電下先執行程式然後再上電,一上電就會有下面的錯誤.


error reading "filea6a578": I/O error
while executing
"gets $channel line"
(procedure "GetData" line 2)
invoked from within
"GetData filea6a578"

dai | 2011年12月30日 下午1:04

如果是這個問題 ~ 那應該是你的裝置上電的時候送了一些怪快的雜訊,然後讓channel出錯了!!

這樣的話可以在channel出錯的時候,再重開就好,像下面的例子:


proc GetData {channel} {
set err [catch {
if {[gets $channel line] > 0} {
puts $line
}
}]

if {$err} {
catch {close $channel}
set channel [open COM1: RDWR]
fconfigure $channel -mode 115200,n,8,1 -blocking 0 -buffering line
fileevent $channel readable [list GetData $channel]
}

}

set channel [open COM1: RDWR]
fconfigure $channel -mode 115200,n,8,1 -blocking 0 -buffering line
fileevent $channel readable [list GetData $channel]

vwait forever

NightGenie | 2011年12月30日 下午1:22

Dai大:
一直沒想到用catch去抓error = ="
目前這樣已經解決問題了,但另外想請問的是,雖然這樣可以一直跑把資料都讀出來,
但在機器完全開機後,要如何再下指令去確定機器是可以work的?
我想讓程式在最後抓個字串確定開完機,然後再下個指令.
可是vwait一直跑我卻沒辦法做動作...

dai | 2011年12月30日 下午2:52

GetData 函數只要有資料進來就會執行,你可以在這個函數裡判斷,如果讀取特定字串,就下命令給機器。

NightGenie | 2011年12月30日 下午7:28

作者已經移除這則留言。

NightGenie | 2011年12月30日 下午8:13

Dai大:
感謝教導! 另外我要做一個周期性的測試,Dai大說用after去做,
以下是我想出來的,不知道Dai大有無更合適的方式?

proc PowerCycle {} {
after 45000 PowerCycle

proc GetData {} {
#main
}
}

dai | 2011年12月30日 下午9:01

在函數裡面宣告函數有點怪 ~ 也許用namespace比較好(文件有說明)

南應科大學生 | 2012年3月2日 下午2:16

老師您好
我想請問一下有關VB的問題
我們要做一個餐飲管理系統
但是碰到不知道如何讓管理者查詢(加總)總收益的狀況
例如管理者想查詢某兩天的收益狀況
要如何從資料庫中選出他所收尋的日期
並將之相加,得到加總的金額呢?

dai | 2012年3月2日 下午4:15

= = 這樣被發現我在哪間學校教書了....

試試類似下面的SQL語法

SELECT SUM(要加總的欄位) FROM 你的表格 WHERE 日期欄位 >= 某兩天的第1天0點整 AND 日期欄位 <= 某兩天第2天的23:59:59;

匿名 | 2012年3月5日 下午6:01

請問您:
有ezdit_0.9.3可單一執行的檔案可供下載嗎?
第一次摸tcl,不知如何使用您的source file!

謝謝

dai | 2012年3月5日 下午10:57

有的 請在這下載 :
http://code.google.com/p/ezdit/

匿名 | 2012年3月6日 上午9:05

感謝您的幫忙!

NightGenie | 2012年3月7日 下午3:36

Dai大:
不得不又來麻煩您了,這次是打包執行檔的問題,
因為打包執行檔似乎沒辦法用package require Expect,
所以我改用source /expect.tcl
並且將C:\Tcl\lib\teapot\package\win32-ix86\lib\Expect5.43.2下的5個檔案全都放在D:去,
然後用freewrapTCLSH.exe去打包
D:\>freewrapTCLSH.exe test.tcl -f 1.txt
1.txt內容為那五個Expect檔

問題在於我的script中有一段是send指令到待測物上然後去expect得到的回應,
但是我發現雖然打包出來的exe檔可以正常執行,但如果沒有跟那五個檔放一起,
那麼在expect的時候就會有問題,讀不到任何東西.
想請問到底打包的步驟哪裡出錯了?
同樣的我也試過用ezdit0.9.2去打包也是相同的結果,必須要把expect那五個檔案放一起才會正常的判斷.
但是同樣的script(改回用package require Expect)直接用tclsh的程式去跑都是正常的,expect也讀的到回應的資料.

dai | 2012年3月7日 下午8:21

之前遇到類似的問題 ,我會expect放在執行檔外面不要包進去
然後在執行檔執行的過程才把這些額外的檔案 require 進來
例如:
執行的過程中把 expect 的套件 跟xxx.exe 放在同一個目錄
然後在xxx.exe執行的時候,把執行的目錄加到 auto_path 裡
這樣就可以正常的用package require Expect

HUUUUUU | 2012年5月8日 下午4:37

請問戴老師,TCL能做擷取圖檔的動作嗎?如果可以又應該怎麼做呢

dai | 2012年5月8日 下午10:23

嗯 ~ 你要擷取的目標是? 螢幕? 視訊? 或是 TK的某個視窗?

PS. 請用DAI代替..戴....

HUUUUUU | 2012年5月10日 上午10:42

SORRY~ DAI老師
螢幕擷取開啟的視窗畫面好像是ctrl+alt+printscreen 那種效果

dai | 2012年5月10日 下午1:51

這邊有一些範例可以參考 http://wiki.tcl.tk/9127

叫我 DAI 就好, 後面的都可以省略 呵 ~

Unknown | 2012年6月16日 下午12:12

你好,路過看到你的文件,介紹的真是太簡潔明瞭了,受益良多,我正愁找不到一個夠投資抱酬率的GUI開發套件說。
請問一下,tcl寫好的程式,可以轉成.exe嗎?還是它一定只能用wish執行呢?

dai | 2012年6月16日 下午8:06

HeIlo,
Tcl可以包裝成Mac ,Windows,Linux的單一可執行檔沒問題的。

Unknown | 2012年6月21日 下午6:59

那Tcl的程式,可以和C/C++的程式互相交換資料,或是觸發彼此的函式嗎?

dai | 2012年6月21日 下午8:38

嗯 ~ 這也算是Tcl的長處吧!

基本上,我們可以很容易的把C/C++的函數編寫成Tcl可以載入的DLL檔案,然後透過載入DLL的方式,讓Tcl的直譯器呼叫C/C++實作的函數。

反過來的話也可以把Tcl的直譯器內嵌在C/C++程式中,讓C/C++來使用Tcl直譯器提供的功能。

另外,如果是獨立的C/C++程式與Tcl程式,也可以用IPC或其它方式來交換資料,這些對Tcl來說都不是難事。

DAI

Unknown | 2012年6月24日 上午8:25

Tcl竟然可以IPC?太神奇了,直譯器語言有這個能力?印象中python好像也沒有。
另外,我看了一些範例程式,它的套件都是哪裡來的啊?是官方有在寫,還是都是社群在寫?
還有,它用require語法就可以使用.dll/.so嗎?那是不是剛剛說的那個套件其實就是用.dll/.so?

dai | 2012年6月24日 下午10:25

事實上常用的直譯語言都有IPC的功能,不管是TCL或是你說的Python都有,而且支援的IPC都不止一種...

例如,TCL在Windows下內建就支援DDE,在Linux下透過額外的套件使用D-BUS通訊也不是難事,而Python也有signal的功能~

你指的範例程式是指? 它們用了哪些套件?

.dll/.so需要用load命令而不是require !!

Unknown | 2012年6月25日 下午10:57

第一個範例用D-Bus監視USB裝置那個,一開始寫了require dbus-tcl,那dbus-tcl是Tcl內建就有的?還是官方提供的?

然後E04這個範例,是先編譯出libtclwii-1.0.so後,我才在Tcl程式中看到package require tclwii。嗯…所以會誤以為Tcl是用require的方式就可以直接使用.dll/.so。

話說回來,查了一下require後面接的應該也是個tcl檔(設定好類別關係的),那為什麼E04這個範例是require tclwii?難道Tcl也內建一個tclwii.tcl嗎?

另外有一個實務上的問題,Tcl有內建存取XML的函式庫嗎?

匿名 | 2012年7月12日 上午11:54

您好:
我在使用serial port時,遇到了一些問題想請教一下。
電腦裏內建的serial port,在使用上沒甚麼問題,程式碼如下:
################
set powerSerialport [open "COM17" w+]
fconfigure $powerSerialport -buffering line -blocking 0 -translation binary -mode 9600,n,8,1 -ttycontrol {RTS 0}
################
但是問題出現在usb to serial,這個時候我在使用上面的指令會報錯,它會說-mode 和 -ttycontrol,是不合乎用法的,請問一下這個地方有解嗎??
OS是windows XP

dai | 2012年7月13日 上午12:42

記得之前使用usb to serial,-mode是沒問題的 (-ttycontrol沒試)。

另外我記得開Serial只能使用 "com1:" ~ "com9:" 的編號,否則的話要使用\\.\comX 的方式

也許你可以改用 open "\\.\com17" r+ 試試看。

匿名 | 2012年7月13日 上午8:48

多謝您的回覆,是我表示的不清楚,我目前可以對COM17做開關的動作,但是在做以下的指令時,它會說-mode不能用。
configure $powerSerialport -buffering line -blocking 0 -translation binary -mode 9600,n,8,1 -ttycontrol {RTS 0}

COM1是正常的serial port===>work
COM17 是USB to serial port===>不work

晚點我試試把com17調成com3-9看看。
BTW "open "\\.\com17" r+" 這個指令會報錯(\.COM17 no such file or directory),但我的com17存在,是不是我哪裡打錯了。
再次多謝您的回覆^^

pprobot | 2012年7月31日 下午3:21

我看到一个比较好的tcl IDE:http://code.google.com/p/mytcl/
推荐交流一下!主要是这个IDE还可以直接调试tcl代码。

翊翾 | 2012年8月6日 下午3:15

Hi Dai你好
今天發現到84版跟85版會有下面的差異,不知道DAI有遇過相關問題嗎?
C:\>tclsh85
% set a -0.06
-0.06
% set b -1.40
-1.40
% puts [expr $a-$b]
1.3399999999999999
% exit

C:\>tclsh84
% set a -0.06
-0.06
% set b -1.40
-1.40
% puts [expr $a-$b]
1.34

jimmy | 2012年8月9日 下午1:55

浮點數的問題
我在8.4版本也遇過類似的問題
我遇到的某些浮點數乘1000000後取整數結果少1
像這篇寫的一樣
http://stackoverflow.com/questions/9903803/why-do-arithmetic-results-differ-when-expr-is-nested-in-tcl

Jerry Lee | 2012年8月17日 下午2:47

Hi Dai你好,

首先謝謝你成立這個網站, 我的TCL知識都從你的網站上獲得。。。再次感謝你。。

目前我想寫一個程式,可以主動去upgrade firmware 去更新設備的firmware. 該設備有提供WEB interface,我用wireshark 捉取封包,發現它是透過post 方式將firmware 上傳. 但不知從何著手,是可以可指導一個方向呢...透過http::geturl

NightGenie | 2012年8月23日 下午6:41

Dai大~
請教一下使用ezdit的時候有辦法變更檔案的圖示嗎?
就是完成後的那個exe檔.

TerryWang | 2012年9月26日 下午10:16

Dai大...好久不見!!

先跟你問個安..

最近開始在碰excel...找資料時發現居然有人將你的教學原封不動貼到自己的部落格

實在太過份了!!! 特地來跟你說一聲!!!

網址: http://jearmy.itpub.net/post/29017/527580

dai | 2012年9月28日 下午11:43

hi TerryWang, 真的好久不見了!!

看起來是在對岸 ... 也只能 長嘆一聲了~~唉!!

匿名 | 2012年10月6日 上午12:44

想請問Dai大...
在重新打包tclkit時...
可以把我要的png圖片,或是gif圖片一起打包起來嗎...
在程式下又如何寫呢?
目前都是用 -image [image create photo -file "./xx.gif"]

想請dai大指點一下...謝謝

匿名 | 2012年10月18日 下午4:54

Dai大~
請問在twapi套件中~
我如果打 twapi::send_keys "{LWIN}" (表示可以執行左win鍵)
假設我想要執行 win+m (全部縮小視窗)
我twapi::send_keys " " 該怎麼打~
希望Dai大可以幫我解惑一下~感恩

匿名 | 2012年11月8日 上午11:17

請問我想透過 tcl 發送 mail,能改變 mail 內文的字體顏色嗎? @@" 我使用了 font =>失敗了!!

匿名 | 2012年11月8日 上午11:19

承樓上,沒寫到謝謝!! 希望能收到回覆,謝謝>////<

Chen | 2012年12月18日 下午5:11

請問 package require 和 source 主要的差別在哪裡呢?
因為看了 tcl.tk 的網站還是不太理解這兩個指令的差別和用法..

dai | 2012年12月18日 下午6:03

在使用上 source 需要指定明確的來源檔案路徑,package require 則以套名的名稱做來載入的依據 ~
package require 在執行時會以::auto_path這個系統變數的內容為依據,去特定的檔案目錄下尋找目標並載入(也是使用source) ~

簡言之package的機制是一個把程式分享給別人的好方法 ~

AndySu | 2012年12月21日 上午1:57

不好意思想請問一下Tcl/tk與Expect的問題
1.如果想在Windows 7x86下開發Tcl/tk與Expect需要安裝哪些軟體?
2.在script中要如何宣告才能使用Expect?

dai | 2012年12月21日 下午2:59

如果你是用ActiveTcl,可在命令提示字元下執行下面的命令安裝Expect

c:/> teacup install Expect

然後在tcl script裡使用下面的命令載入套件

package require Expect

Yu-Wei su | 2013年1月24日 下午11:27

不好意思請教一下 如果是TCL可以再使用Serial Port 時配合Expect來期待他回傳回來的值嗎?
是否有案例可以給我看嗎?

dai | 2013年1月25日 上午12:27

請參考這個範例

http://wiki.tcl.tk/1108

Yu-Wei su | 2013年1月25日 上午1:20

學長您好小弟不才想再次請教
1.您指的是下面這個範例嗎?
2,如果我需要的模式是
需要透過Serial Port然後發送一個指令給Embedded system 然後他會還傳一個訊息給我
我在判斷結果再作處理
該如何編寫

# Example (2): Fileevents
set serial [open com2: r+]
fconfigure $serial -mode "9600,n,8,1" -blocking 0 -buffering none -translation binary
fileevent $serial readable [list serial_receiver $serial] <---這行是當serial port 可以讀動作就會跳到serial_receiver。

proc serial_receiver { chan } {
if { [eof $chan] } { <----因為serial port有接收時間的問題所以可否使用Expect 來等待他回應嗎?
puts stderr "Closing $chan"
catch {close $chan}
return
}
set data [read $chan]
set size [string length $data]
puts "received $size bytes: $data"
}

dai | 2013年1月25日 上午11:43

學弟有我的電話嗎?直接打過來比較快

Yu-Wei su | 2013年1月25日 下午12:50

><"~學長 我沒有妳的電話
我只要要透過Serial Port然後發送一個指令給Embedded system 然後他會還傳一個訊息給我
我在判斷結果再作處理
再傳送這樣

dai | 2013年1月25日 下午5:05

PC及板子之間的通訊有標準的通訊協定嗎? 或是你自己可以訂?

如果有既定的通訊協定,就要依通訊協定的規範來處理 ~ 例如:狀況或是拆解封包格式

不然最簡單的方法是不要用事件驅動,送出指令後delay一段時間,再去讀回傳訊息....比較簡單

ylcheng | 2013年3月13日 上午9:26

dai 您好:
我想要問有關於變數的問題,

set sec1 $var1
set sec2 $var2
......
set sec10 $var10

for {set c 1} {$c <= 10} {incr c} {
if {$sec$c != 0} {

在 $sec$c 一直出錯, 變數裡面又有變數, 語法要怎麼寫才會對?謝謝.

匿名 | 2013年3月13日 上午11:48

$sec$c 改為 [set sec$c]

dai | 2013年3月13日 下午4:50

嗯...用陣列比較適合

set sec(0) a
set sec(1) b

for {set i 0} {$i <= 1} {incr i} {puts $sec($i)}

Todozen | 2013年3月14日 上午10:57

Dai~你好,我想請教一個問題,當有另一個程式尚在寫入檔案時,而我同時間想利用TCL來讀取寫入的檔案內容並且及時的輸出在TCL的視窗上,想請問該如何處理呢?thanks.

dai | 2013年3月14日 下午12:15

並不建議你這麼做,也許換個方法比較好!!
除非你是想用mmap,做IPC ?

ylcheng | 2013年4月2日 下午12:25

之前的問題已經順利解決, 非常謝謝先進的幫忙,
不過這次又遇到問題,
需要先進的幫助:
程式碼如下:

set dmym1X [expr int ([expr floor($W/1)])]
set dmym1Y [expr int ([expr floor($L/1)])]

if {$W >= 1.3 && $L >= 1.47} {
for {set Dm1X 1} {$Dm1X <= $dmym1X} {incr Dm1X} {
set Dm1Xv [expr ($Dm1X - 1)+0.6]
set Dm1Xl [expr ($W - (0.35*2))]
if {$Dm1Xv <= $Dm1Xl} {set Dy1X $Dm1X}
}
for {set Dm1Y 1} {$Dm1Y <= $dmym1Y} {incr Dm1Y} {
set Dm1Yv [expr ($Dm1Y - 1)+0.6]
set Dm1Yl [expr ($L - (0.435*2))]
if {$Dm1Yv <= $Dm1Yl} {set Dy1Y $Dm1Y}
}
}

當 $W = 2.3 $L = 2.47 時,
dmym1X = 2
dmym1Y = 2

問題會發生在這,
if {[(2-1)+0.6] <= [(2.3-(0.35*2)]} {set Dy1X $Dm1X}
1.6 <= 1.6, Dy1X 卻是 1, 想不透...

不過另一個卻是正常
if {[(2-1)+0.6] <= [2.47-(0.435*2)]} {set Dy1Y $Dm1Y}
1.6 <= 1.6, Dy1Y 是 2, 沒錯, 就是要 2

想不出來 Dy1X 怎麼會是 1, 需要先進的指點, 謝謝.

dai | 2013年4月2日 下午8:15

對許多程式語言來float是近似值,試試這樣 :

set Dm1Xv [format "%.4f" [expr ($Dm1X - 1)+0.6]]
set Dm1Xl [format "%.4f" [expr ($W - (0.35*2))]]

匿名 | 2013年4月12日 下午3:25

你好 我想請教下
我是用notepad++來直譯我的TCL
程式內有用到thread 來處理無窮迴圈與GUI的問題
無窮迴圈是讓他有隨時偵測modem的功能 因為如果一開始沒有接上modem 整個GUI會lag很嚴重
目前只想到用thread來分開處理兩個物件
GUI為main_thread 無窮迴圈為second_thread 這樣GUI就不會lag
重點是用notepad++執行TCL 功能上非常正常
但是直接執行程式檔案 卻發現second thread掛掉了?? 迴圈功能已經失效(因為沒有偵測到 我已經拔掉modem)
請問 以你的經驗是怎樣的情況 竟然會出現同一個程式 執行方式不一樣 卻有不一樣的結果

PS.我有把它封裝成exe 卻也是一樣結果
只有用notepad++執行TCL 才一切正常

dai | 2013年4月12日 下午5:27

試試把second thread裡所有送到model之外的puts 指命拿掉(ex. 除錯用的輸出) 。

匿名 | 2013年4月12日 下午11:48

可能沒有code 無法解釋清楚
可以留email嗎
我寄code給你
麻請你檢查下

匿名 | 2013年4月13日 上午12:46

另外請教
HW:1.0 ; boot:123 ; SW: 1.23 ; Model: moto >>
除了boot不用抓 其餘的資訊要抓
在perl底下執行 可以成功抓到
{ regexp {HW\:\s(.+?)\;.*SW\:\s(.+?)\;.*MODEL\:\s(\w+)}
但在TCL 抓Model只抓到m 沒有抓到完整的moto

要一定在加上\> 才可以抓到正確的moto
{ regexp {HW_REV\:\s(.+?)\;.*SW_REV\:\s(.+?)\;.*MODEL\:\s(\w+)\>}

請問這是bug?

dai | 2013年4月13日 下午9:42

給上上樓

有試過把puts拿掉也不行嗎? 事實上之前有遇過就是這樣的情況。

dai | 2013年4月13日 下午9:47

regexp 我不知道這是不是bug,抱歉!!

匿名 | 2013年4月13日 下午10:57

因為我不是用puts
我是錯誤訊息顯示在entry
例如set ::entry "error"

匿名 | 2013年4月13日 下午11:02

不過有個地方 就是把所有puts註解掉(副程式有用到)
就OK了
不曉得是什麼緣故
果然還是dai有經驗

dai | 2013年4月14日 下午2:56

如果在main thread之外的thread要puts stdout,可以用非同步的thread::send把命令傳到main thread執行,這樣就不會有問題了

小豬 | 2013年4月18日 上午11:49

作者已經移除這則留言。

小豬 | 2013年4月18日 上午11:50

請問tktreectrl在linux環境下要
如何安裝?

dai | 2013年4月18日 下午1:07

最簡單的方法是先安裝 activetcl for linux 然後執行
teacup install treectrl

小豬 | 2013年4月19日 上午11:13

收到! 感謝dai~~

Jarry_Chang | 2013年5月2日 下午3:29

大大,請問如果要用 tcl 與 http 搭配使用
除了 CGI 還有其他建議嗎?

dai | 2013年5月2日 下午7:11

嗯 ~ Rivet 是另一個方法,但不建議

http://tcl.apache.org/rivet/

Jarry_Chang | 2013年5月13日 下午5:05

大大,請問一個 Thread 與 udp deamon 程式的問題

TK Button 按下 -> create Thread -> open udp deamon
udp deamon listen port 2066
接收固定格式字串

目前遇到的問題是,
使用 tclsh 執行程式碼,可以正常接收
打包之後, 運作會出現 can not find channel named "sock288"

但是如果不透過 Thread
TK Button 按下 -> open udp deamon
打包之後, 運作正常

請問是什麼原因呢?

dai | 2013年5月14日 下午12:20

感覺跟時間有關係 ~ 例如可能有好多個thread,但其中的某些需要別的thread先執行過才能正常運作 ~

Jarry_Chang | 2013年5月14日 下午3:07

大大,請問這個需要先執行的 Thread 是什麼?

dai | 2013年5月14日 下午4:23

換個方式說好了,也許你開了某一個socket但這個socket因為某些原因被關掉了(ex.網路卡有問題,網路斷線)
但你還是繼續使用這個已經失效的 socket

Jarry_Chang | 2013年5月14日 下午4:29

大大,但是我用 netstat 查看 udp listen 的 port 還在低

Jarry_Chang | 2013年5月14日 下午4:50

大大,我在 linux 的環境下測試是ok的,但是在 Windows XP 、7 是不ok的

這會是因為 windows 的 Tcl Thread 套件問題嗎

dai | 2013年5月14日 下午4:53

這我就不知道了 ~

Jarry_Chang | 2013年5月15日 上午8:36

謝謝大大的解說

Jarry_Chang | 2013年5月15日 上午9:31

大大,我換了一個 tclkit 之後就好了

dai | 2013年5月15日 上午9:59

你換了哪一個版本的?

Jarry_Chang | 2013年5月15日 上午10:21

大大,

從這個 http://www.patthoyts.tk/tclkit/win32-ix86/8.6.0/tclkit-gui-860.exe

換成 http://www.patthoyts.tk/tclkit/win32-ix86/8.6.0/tclkit860.exe

margi | 2013年5月15日 下午5:32

您好!

我在8.4.19.6的版本上安裝http1.1的Lib,目前GET網頁都沒問題,但執行POST時,終端機會顯示"ParseHttpLineElement: Error finding Referer!"的錯誤訊息。我比對封包後發現我送出的封包的確少了Referer這一項,不知是否因為如此造成我無法修改網頁設定? 還請您可以給些建議,謝謝!

## POST data to Server
set Req_url "http://192.168.100.1/goform/advanced/ip-filters"
set Post_Data "\[truncated\] IpFilterAddressStart1IPX=192.168.0.11&IpFilterAddressEnd1IPX=192.168.0.13&IpFilterAddressStart2IPX=&IpFilterAddressEnd2IPX=&IpFilterAddressStart3IPX=&IpFilterAddressEnd3IPX=&IpFilterAddressStart4IPX=&IpFilterAddressEnd4IPX=&IpF"
update
set request [list ::http::geturl $Req_url -query $Post_Data]
if {[catch {set token [eval $request]} err]} {
puts "Set IP Filter Fail: $err"
}
after 200
set ret [::http::wait $token]
if { $ret != "ok" } {
puts "POST IP Filter Setting Fail!"
}

dai | 2013年5月15日 下午6:31

嗯 ~ 試看看這樣有沒有用:

set request [list ::http::geturl $Req_url -query $Post_Data -headers [list Referer 192.168.100.1]]

margi | 2013年5月16日 上午10:56

您好!

可以解決找不到Referer的問題,但POST修改網頁還是不成功,我再研究看看;若您還有其他建議或想法還請您不吝提點! 謝謝!!

dai | 2013年5月16日 上午11:15

不用客氣的~

Jarry_Chang | 2013年5月23日 下午2:03

大大,請問一個 tdbc::sqlite3 的使用問題

如果一個程式開了 3 個 Thread 去 read/write sqlite 的 db
3 個 Thread 有可能會操作到同一個 table
這樣 sqlite 會不會當掉?

我發現在 write db table 會出現
"database disk image is malformed"

dai | 2013年5月23日 下午3:10

並不建議你這樣做!!
把所有操作db的動作都在一個thread (main thread)裡完成比較不會有問題。
其它的threads可以透過thread::send請求main thread來操作db.

Jarry_Chang | 2013年5月24日 上午9:22

大大,請問一下

如果 thread AA (非 main thread) 透過 thread::send 請求 main thread 來操作db
但是 thread AA 是操作 Select xx table ,這樣要如何回傳 Select xx table 的數值呢?

dai | 2013年5月24日 上午11:55

如果表格不會很大就叫 thread (db) 把整個表格送回來
如果表格很大,而且時常會query,那就換MariaDB、redis或Mongodb,看你的應用來決定。

Jarry_Chang | 2013年5月24日 下午2:56

大大,

我發現把需要 write db 的部份 交給 Main Thread 處理 ,
read db 的部份在個別的 thread 處理
sqlite 產生錯誤的狀況有改善

dai | 2013年5月24日 下午3:32

雖然sqlite的設計可以允許一次多個process或thread存取db檔案,但事實上sqlite的設計並不是以「多人連線」為目標。
所以當超過一個process/thread同時寫入db檔案的時候,lock會花去很多的時間,導致效率大打折扣 ~
如果你有這樣的狀況趁早換資料庫吧!! 不然痛苦才剛開始,以後你會花更多的時間在維護成本上。

Jarry_Chang | 2013年5月24日 下午4:17

感謝大大的回覆 <(_ _)>

deimos | 2013年5月26日 上午3:29

前輩您好,

可否向您請教

學生最近查詢到 tmatlab 這份文件 http://www.soelter.de/Software/tcl_tk/tmatlab.html
它可以讓 Tcl 跟 matlab 相互溝通,它的檔案為 tmatlab.dll 檔,我將其檔案放置在 C:\tcl\lib中,仍然無法順利使用
會出現 couldn't load library" tmatlab ": invalid argument 這樣的錯誤訊息
可能是 Tcl 不知道它的存在,該怎麼讓他載入Tcl中,讓它看得懂呢?

若是這份檔案無法使用,使否有其他的方法可以讓 tcl 與 matlab 溝通呢?
網路上還有 TMath,這份檔案可以使用,但是他好像是寫給linux使用的
我雖然用壓縮軟體解開他的 tar 檔,但似乎無法使用

我的作業系統是 win7 64
Matlab 2013 64
Tcl\Tk 85 64

不好意思請教您了

dai | 2013年5月26日 上午9:59

嗯 ~ 看起來tmatlab.dll是有找到,但載入的過程有錯誤,這應該是版本的問題。

我看了一下你貼的網址,tmatlab似乎適用在Tcl/Tk 8.2,也許你換32位元的Tcl/Tk 8.5試試,如果還是不行就看你要不要試試老舊的Tcl/Tk 8.2了。

swnt | 2013年5月26日 下午8:21

謝謝前輩的說明,學生更換至32位元試試
另外,可否請教您該如何載入tmatlab.dll呢?
謝謝您了

dai | 2013年5月26日 下午11:04

嗯 ~ 假設你的tmatlab.dll放在 c:/ 然後執行下面的命令

load c:/tmatlab.dll

load 的使用方法可以參考

http://docs.activestate.com/activetcl/8.5/tcl/TclCmd/load.htm

deimos | 2013年5月27日 下午6:07

謝謝前輩的指點
學生嘗試 "Tcl 85 32位元 與 64位元" 之後,仍然無法使用
可能要使用Tcl82,但是學生的軟體是基於Tcl85寫的,所以改用Tcl82可能會產生其他問題
不知道是否還有其他方法可以讓Tcl與Matlab溝通呢?

dai | 2013年5月27日 下午6:47

抱歉~平常沒有在用matlab所以沒有特別去研究。

deimos | 2013年5月27日 下午11:14

感謝前輩的解答
學生再測試看看
謝謝您了

Jarry_Chang | 2013年5月30日 下午2:46

大大,

請問一下,在 Tcl/Tk 哪一個套件可以建立 ARP 封包呢 ?

ylcheng | 2013年5月30日 下午5:03

dai 您好:
我遇到有關 regsub 的問題,

set labelValue test_<0>
regsub -all "$BE" $labelValue "$AF" newLabelValue

$BE 跟 $AF 是輸入的變數,
當輸入 $BE 是 <, $AF 是 [ ,
結果是 test_[0>
再輸入 $BE 是 >, $AF 是 ] ,
結果會是 {test_[0]},
多跑出{}

換個順序,
當輸入 $BE 是 >, $AF 是 ] ,
結果是 test_<0]
再輸入 $BE 是 <, $AF 是 [ ,
結果會是 test_[0\],
多跑出\

實在是想不透,
麻煩大師指點,
謝謝.

dai | 2013年5月30日 下午8:33

在我的tcl8.6裡

set labelValue {test_[0>}
set BE ">"
set AF {]}
regsub -all "$BE" $labelValue "$AF" newLabelValue

puts $newLabelValue

輸出的結果是 test_[0] 並不會多出大括號

dai | 2013年5月30日 下午8:37

To Jarry,

試試看這個 http://linux.die.net/man/8/arping

ylcheng | 2013年5月31日 上午10:15

我 tcl_version 是 8.5
我早上試了一下在 terminal 跑 dai大 的範例,
結果不會出現 {},
再把自己寫的程式改成 dai大 模式,
結果也不會出現 {},
恩...
應該是我應用在商業軟體的時候,
有些地方沒注意到,
謝謝 dai大 的測試.

以下是應用在商業軟體的程式碼:
proc replace { } {
set rp_before [gtCreateStringField -name rpbefore_f -prompt "Before :"]
set rp_after [gtCreateStringField -name rpafter_f -prompt "After :"]
set rp_date [gtCreateAppForm -name rpdate_f -title "Label replace :" \
-fields [list $rp_before $rp_after] \
-buttonLayout OKCancelApply \
-callback {replace_main $rpdate_f(rpbefore_f:value) \
$rpdate_f(rpafter_f:value)}]
gtDisplay -name rpdate_f
}

proc replace_main {BE AF} {
#BE = before
#AF = After
set cvID [lakerGetWndCellViewId ]
set aList [dbGet -obj $cvID -attr Shapes]
puts "tcl_version"

foreach object $aList {
if {[dbGet -obj $object -attr Type] == "Label" } {
set labelValue [dbGet -obj $object -attr Text]
regsub -all "$BE" $labelValue "$AF" newLabelValue
dbSet -obj $object -attr Text -value $newLabelValue
}
}
}

匿名 | 2013年6月13日 上午9:56

您好: 小弟是一個tcl的初學者, 目前遇到一個問題

我先用c++ 編譯出一個 .exe檔 想tcl裡執行他 上網爬文的指令好像是 exec

但不是很清楚要怎麼用, 想請教您一下.

目前我是在windows上安裝EZDIT來編輯TCL檔的~

匿名 | 2013年6月13日 上午10:02

您好: 在您的文章中有提到只要 exec A.exe即可

但我將 xxx.exe 與 tcl放在一起執行後出現 找不到此執行檔的訊息

不曉得是什麼原因呢??

dai | 2013年6月13日 下午3:30

這可能是你執行tcl時的工作目錄,與存放A.exe的目錄不一樣產生的問題。

你可以在執行這樣試試

puts [pwd]
exec A.exe

看看 puts 輸出的內容,來確定工作目錄是不是正確。

NCKUeda | 2013年6月14日 上午10:18

Dai老師您好: 目前是成大的學生, 正在參考您的網頁學習tcl中

目前有遇到幾個問題想請您, 目前的想法是想要建立一個列表 ,

在列表裡面的項目點擊左鍵後可以有另外一個視窗可以讓使用者輸入某些東西

假設目前列表裡有兩個項目A, B點擊A出現的視窗叫C, B出現的為D,如果我

預想的C與D是要擺放在一個固定的位置,我的想法是一開始就把C與D的視窗先建好

並掛在 .root下,等到A與B被點擊後再把他們呼叫出來,不曉得這種做法可不可以??

另外再請教您一下,再看您的文章中有提到可以利用for迴圈來建立按鈕,但用迴圈好像所有的按鈕的命令都要一樣,

那如果不同的按鈕被觸發要執行不同事件的話,那要如何對不同的按鈕指定不同的 -commond 呢??

參考您之前的文章, 判斷觸發列表中的項目的作法,好像是利用滑鼠點擊的座標去判斷是哪個項目被觸發,

想請問您一下, 假設得知項目A被觸發,那要如何可以得到與項目A對應的東西並把他呼叫出來呢??

麻煩老師了

NCKUeda | 2013年6月14日 下午3:18

Dai老師您好: 假設現在cirname這個變數存的值是a

然後我利用這個變數建立了一個列表,命名方式如下 a$cirname

想請問一下老師,如果我之後要用foreach這個東西去存取a$cirname這個列表裡的東西

應該要如何寫呢?? 我目前寫的不能成功執行, 程式碼如下: 麻煩老師了

foreach {item} $a$cirname {
puts $item
}

匿名 | 2013年6月14日 下午5:29

foreach {item} [set $a$cirname] {
puts $item
}

匿名 | 2013年6月14日 下午5:30

foreach {item} [set a$cirname] {
puts $item
}

dai | 2013年6月14日 下午11:59

hi NCKUeda,

大概像這樣寫:

proc tv_dclick {tv x y} {
set item [$tv identify item $x $y]

set dlg [toplevel $tv.dlg]

set txt [ttk::entry $dlg.txt]
$txt insert end [$tv item $item -text]

set btn [ttk::button $dlg.btn -text "關閉" -command [list destroy $dlg]]

pack $txt $btn -side left
wm geometry $dlg 200x100+100+100
tkwait window $tv.dlg
puts xxx
}

set tree [::ttk::treeview .tree -show tree]
foreach item [list 1 2 3 4 5] {
$tree insert {} end -text "項目$item"
}
set btn [::ttk::button .btn -text "選取的項目" -command {
puts [.tree selection]
}]
pack $tree -expand 1 -fill both
pack $btn -expand 1 -fill both

bind $tree [list tv_dclick %W %x %y]

dai | 2013年6月15日 上午12:02

如果用迴圈建立按鈕的話...也許可以這樣處理:

set cmds [list b1 fun1 b2 fun2 b3 fun3]
set i 0
foreach {txt cmd} $cmds {
ttk::button .btn_[incr i] -text $txt -command $cmd
}

NCKUeda | 2013年6月16日 下午4:25

Dai老師您好: 謝謝您的回答, 您的網站讓我受益良多

想請教老師, 假設我利用窗格視窗將三個視窗並聯在一起,假設為A, B, C

有辦法如果我點選了A第一個item的話就連B跟C的第一個item也一起選取嗎??

另外想請問一下視窗的邊框可以指定有或沒有嗎?? 麻煩老師了.

NCKUeda | 2013年6月16日 下午6:59

Dai老師您好: 想請教您一下 假設現有 A, B, C, D, E 五個物件

但我希望C這個物件要在某個按鈕後被按下才出現, 且出現位置是在B跟D之間

我在forget後直接 grid C的話會接在E下面. 不曉得要加那些參數才能達到我要的需求呢??

麻煩老師了.

dai | 2013年6月18日 上午11:45

Hi NCKUeda,

1.假設你有3個treeview元件分別是tv1,tv2,tv3,程式可以類似這樣寫

bind $tv1 [list tv_dclick %W %x %y]

proc tv_dclick {tv x y} {
set item [$tv1 identify item $x $y]
$tv2 selection set $item
$tv3 selection set $item
}

2.pack的指令可以指定-after 及 -before的選項,所以可以像這樣:
pack $C -after $B

NCKUeda | 2013年6月19日 上午9:59

Dai老師您好: 謝謝您的回答, 目前遇到有關canvas的問題想請教您

目前創造出一個畫圖的地方, 並且畫上數個矩形, 想達成可直接拖曳矩形的功能

目前在網路找到的作法為:

proc CanvasMarkIt { x y can } {
global canvas
#$can raise current
set x [$can canvasx $x]
set y [$can canvasy $y]
set canvas($can,obj) [ $can find closest $x $y ]
set canvas($can,x) $x
set canvas($can,y) $y
}
proc CanvasDragIt { x y can } {
global canvas
set x [$can canvasx $x]
set y [$can canvasy $y]
set dx [expr $x - $canvas($can,x)]
set dy [expr $y - $canvas($can,y)]
$can move $canvas($can,obj) $dx $dy
set canvas($can,x) $x
set canvas($can,y) $y
}
.layoutview bind movable {CanvasMarkIt %x %y %W}
.layoutview bind movable {CanvasDragIt %x %y %W}

上面的做法bind綁定的好像是.layoutview裡tag為movable的物件, 然後移動離點擊座標最近的item.

但如果今天有物件A, B, C, D, E, F 存在.layout view裡, 且tag 分別為 C1, C1, C2, C2, C3, C3.

那上述 bind 後的 tag 要怎麼設定才能綁定 c1 or c2 or c3呢?? 另外想請問老師, 在canvas的操作中, 有

指定可以檢查目前點擊的位置是哪個item嗎?? 我在官方手冊只有看見cloest的. 最後想請問老師, 假設我目前移動

tag為c1的item, 那我同時移動其他tag為c1的item呢?? 是要用 find with tag的指令逐一移動嗎?? 還是有其他的方法??

麻煩老師了.

dai | 2013年6月19日 下午12:14

NCKUeda 方法大概是這樣:

1.把A~F物件都使用同一個tag且bind到CanvasMarkIt , CanvasDragIt
2.在CanvasMarkIt , CanvasDragIt中操作物件時以path(路徑)為依據,不要用tag,這樣就不會大家一起被移動
3.把每一個物件都加入同一個tag的並bind到click事件這樣用滑鼠點到某一個物件,就會知道點中誰了

NCKUeda | 2013年6月19日 下午2:57

老師您好: 想請問老師提到的第二點和第三點的程式大概要怎麼寫呢??

第二點中, 目前不論點擊canvas裡的哪個物件回傳的path皆為.layoutview這個path,

裡面的item似乎沒自己的path, 第三點中, 不是很了解如何利用click點擊直接得到是

canvas裡的哪個item被點擊到, 目前只知道可以利用點擊的座標找到離那點最近的item,

但這樣如果點擊空白處拖曳的話一樣有item會被移動, 與我想要的有點不一樣. 我看了官方

有關canvas的文件好像沒有可以檢查此點擊座標是在哪個item內的指令. 麻煩老師了.


dai | 2013年6月19日 下午3:22

嗯 ~ 其實你貼的範例程式裡面,已經是使用第2,3點的方法了,所以請參考你自己貼的程式。

NCKUeda | 2013年6月19日 下午4:35

老師您好: 謝謝老師的提醒, 問題已解決了 (^.^)

NCKUeda | 2013年6月26日 下午3:40

Dai老師您好: 目前我使用 exec 這個指令來呼叫c++的執行檔

假設程式如下

exec A

B

因為我B是要去吃A吐出來的記事本才能動作, 所以B必須等待A跑完

目前是直接執行exec A是可以完成 但在執行TCL檔的terminal上看不到A這個執行檔在運行的過程

若執行exec A & 則可以看到運行的過程, 但這樣因為背景執行的關係, B不會等待A執行完就會先跑

導致結果錯誤, 請問老師不曉得有沒有方式可以看到A的執行過程且B會等待A結束在執行的方法呢?? 麻煩老師了

dai | 2013年6月26日 下午5:48

1.我常用pipe的方法: 參考 http://wiki.tcl.tk/1241 (fd7 的部份)
2.使用fileevent讀fd7的內容: 參考 http://wiki.tcl.tk/880

NCKUeda | 2013年6月27日 下午6:22

Dai老師您好: 謝謝您的回答, 我目前在一個副程式 (proc)中

, 利用了toplevel的指令新建了一個視窗, 並在這些視窗裡建立了一些tree

那我是想利用這個視窗給使用者輸入某些資訊, 按ok後關閉視窗, 之後我利用

那些tree裡的資訊做某些事情, 但我目前是設定當按ok後就執行 detory那個視窗

但這樣當視窗消失後好像連裡面的Tree都不在了, 想請問一下老師有沒有方法可以將

視窗隱藏起來而不要銷毀, 使的視窗關閉後依然可以存取裡面的子元件的東西呢??

NCKUeda | 2013年6月27日 下午6:51

老師不好意思再請問您一個問題, 我利用了您在manu章節中 將一個manu加入toplevel中

程式碼如下:

menu .topopt -type menubar

.topopt add cascade -label "setup" -command { setuptool }
.topopt add cascade -label "test" -command { puts "AAA" }
. configure -menu .topopt

執行後再Linux環境下無法點擊選項可能是什麼原因造成的呢?? 在windows利用ezdit可正常點擊, 麻煩老師了.

dai | 2013年6月27日 下午7:12

hi NCKUeda ,

1. 習慣上我會在 toplevel destroy的時候把需要的資料都儲存到某個namespace的變數裡,然後在其它地方使用,不知道這樣有符合你想要的功能嗎?
2. 你試看看在menu上按住滑鼠的左鍵不放,然後移動滑鼠看看會有什麼狀況。


NCKUeda | 2013年6月27日 下午9:33

老師您好, 我剛剛試了一下老師說的在按住左鍵然後拖曳好像沒有什麼

情況發生, 不曉得是不是我哪邊弄錯了呢?? 麻煩老師了.

dai | 2013年6月27日 下午11:09

這樣阿 @@

你用哪個版本的Linux? 哪一個版本的tcl/tk? 我有空裝來試看看好了!!

NCKUeda | 2013年6月28日 上午10:32

LINUX: CentOS 5.9
Tcl : 8.5.14

麻煩老師了~ 我測試在menu裡加入按鈕 並在按鈕後面下-command指令可正常work

似乎是menu本身的command不能用.

dai | 2013年6月28日 上午11:47

其實,我們很少在menubar的item上設定-command的選項,好像多數看到的程式也都是把需要執行的功能放在popup menu的item裡.

menu .topopt -type menubar
menu .topopt.file -tearoff 0

.topopt add cascade -label "setup" -menu .topopt.file

.topopt.file add command -label "open" -command {puts "open"}
.topopt.file add command -label "save" -command { puts "Save" }
. configure -menu .topopt

匿名 | 2013年6月30日 下午11:09

老師您好:

請問有語法可以取得目前螢幕的解析度是多少嗎??

dai | 2013年7月1日 下午12:02

用下面兩個命令就可以了:

winfo screenwidth .
winfo screenheight .

NOOOOOB | 2013年7月10日 下午8:04

您好~ 我是剛接觸Tcl的新手,
想請問一下,
通常假如我執行一個命令大概像是:
C:\a.bat ppp ppp是參數
在tcl裡面我寫成
exec "c:/a.bat ppp" 是不能執行的,
想請問一下tcl語法裡面要怎麼下參數呢?

dai | 2013年7月11日 上午12:32

這樣就好:

exec c:/a.bat ppp

Jarry_Chang | 2013年7月15日 上午11:23

大大,請問一下

我使用下面的方式把 時間的分鐘取出並格式化 我要讓 個位數的時間由 00~09 轉成 0~9

set dateTime [clock seconds]
set minute [format %d [ clock format $dateTime -format "%M" ]]


但是有時候會出現

expected integer but got "09"
while executing
"format %d [ clock format $dateTime -format "%M" ] "

這樣的錯誤

我是否用錯方法了?

dai | 2013年7月15日 下午1:13

0開頭的數字表示8進制,出現9的話就錯了,先把0處理掉吧!!

匿名 | 2013年7月15日 下午1:47

DAI 大:

TCL 要怎麼樣才能把 EXCEL 當成 DB 來使用
可以下 SQL CMD 來查詢我要的資料?

目前只有我只有做到單單讀 EXCEL

匿名 | 2013年7月15日 下午2:26

老師您好~

若我在程式中執行 toplevel .xxx 產生一個新視窗

有辦法能指定此視窗的出現位置嗎, 絕對位置或是在某個視窗的相對位置這樣...

dai | 2013年7月15日 下午3:41

用TDBC可以操作EXCEL,這邊有參考資料 http://wiki.tcl.tk/20343

dai | 2013年7月15日 下午3:43

可以用下列的命令

wm geometry .xxx 800x600+100+20

最後那一串的格式是 widthxheight±x±y

Jarry_Chang | 2013年7月15日 下午3:53

感謝大大 的說明

匿名 | 2013年7月22日 下午3:04

DAI 大
上次您說 http://wiki.tcl.tk/20343 這裡可以查到一些 EXCEL 下 SQL CMD 的範例
那查詢到之後那些欄位要怎麼使用啊?
有類似屬性或方法之後的地方可以參考嗎?

感謝...

dai | 2013年7月22日 下午3:40

嗯 ~ 這個我也不清礎也,我大多是用tcom來操作excel的.

匿名 | 2013年8月19日 下午4:39

dai 請教下
假如tcp.txt裡面有兩行資訊

0000070: a43e d41e 349c fc3c c4fd 23f5 89f7 b59a .>..4{..<..#.....
0000080: 7b7a 3c0c 6753 71bc 0f84 00 {0z<.gSq....

set fd [open c:/tcp.txt r]
while {![eof $fd]} {
gets $fd data
puts [lindex $data 0]
}
把data當作list取index會出錯 原因是{0z<.gSq... 有左大括號
希望使用lindex可正確取出 而不會出錯

dai | 2013年8月20日 下午4:04

應該這樣就可以了:

set items [split $data " "]
puts [lindex $items 0]

NightGenie | 2013年9月11日 下午3:34

DAI:
又來麻煩您了.
我在ezdit直接跑程式的時候,telnet印出的資訊是中文的 "正連線到 192.168.1.1..."
可是包裝好以後,執行卻是亂碼 "¥¿³s½u¨ì 192.168.1.1..."
程式碼部分我是直接用ezdit新增檔案去編寫的,字元編碼部分換了big5,utf-8,cp950,ascii都一樣.
我也重新包裝過了tclkit,確認裡面都有這些編碼.

匿名 | 2013年9月11日 下午6:40

各位大大::

小弟才剛接觸tcl,有很多事情還不清楚@@
請問該怎麼取 list 中的最大值或最小值?

NightGenie | 2013年9月11日 下午7:20

To 匿名:
安裝tcllib
package require math::statistics
資料內最小值: ::math::statistics::min {3 2 5 6} => 2.0
資料內最大值: ::math::statistics::max {3 2 5 6} => 6.0

«最舊 ‹較舊   1 – 200 (共 208 個)   較新› 最新»
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