#

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

70 個意見

dai | 2013年11月8日 下午2:22

作者已經移除這則留言。

TerryWang | 2013年11月14日 上午11:30

Dear Dai大, 許久不曾問問題囉!!
不過我都一直常回來看看您的網站!!!

最近又遇到一個問題,想請問一下我使用tcl htttp geturl
雖然可以抓下來html,但是以google為例,抓下來後圖示都不見了..
請問該如何抓取完整的網頁呢?

dai | 2013年11月14日 下午8:56

若要連圖片一起下來的話,要先找出html裡所有img的標籤,然後找到src的屬性,把src屬性中指示的圖片url取出,最後再用geturl下載圖片。
簡單的說,你要會「解析」html的文件。

林建周 | 2013年11月18日 下午12:06

Dear Dai 大
目前自己才剛接觸TCL,有遇到一個問題!!

我餵了一個純文字檔的report

ex : report內容為
ABCD
......
.......
....
....
.....
XXXXXXX

目前動作指令是

只要String match 到 ABCD 就開始抓下面的內容 到XXXXX(不是report的最底端)的時候停~

應該如何寫比較好~

我有使用正規表示式 寫出想要的東西~

可是比較冗長~

如果想用較為簡單的方式呢??

是使用一行一行餵檔案的方式!!

while { [gets $file line] >= 0

匿名 | 2013年11月18日 下午5:13

set index 0; set content ""
while {[gets $file line] >=0} {
if {$line=="ABCD"} {set index 1}
if {$index==1} {append content $line}
if {$line=="XXXXX"} {set index 0}
}

林建周 | 2013年11月18日 下午6:02

感謝 匿名大大~~
雖然自己有寫出來惹~~可是你的行數比我寫的精短好多~~感謝!!!

另外我有另一問題

set path [glob -type f ./*/{AAA,BBB,CCC}]
foreach x1 $path {
if { [file exists "$x1"] == 0 } {
puts "\n--$x1 Not Find Source --\n"

我使用glob這個語法來找尋 資料匣*號中的AAA,BBB,CCC
並存入path 使用foreach來一個一個打開 並讀取資料

但由於我使用這樣的方式 導致我之前所寫的
if { [file exists "$x1"] == 0 } {
puts "\n--$x1 Not Find Source --\n"
變成無用的判斷式(之前是指定path)所以可以判斷檔案存不存在

可是現在變成使用glob會導致 他並不會告知 *號中 沒有AAA BBB CCC這些檔案

應該如何更改比較順暢!!!

匿名 | 2013年11月19日 上午10:15

set allfile ""
foreach {item} [glob -nocomplain -directory . -type {d} *] {
foreach file {AAA BBB CCC} {lappend allfile $item/$file}
}
foreach x2 $allfile {
if {[lsearch $path $x2]!=-1} {puts "have $x2} else {puts "dont have $x2}
}

Hank 林 | 2013年11月19日 上午11:04

謝謝您!!

立馬來嘗試看看!!

dai | 2013年11月19日 下午8:51

謝謝 匿名 朋友的幫忙,我也提供一個範例給Hank 林,請試試看:

foreach {d} [glob -nocomplain -directory . -type {d} -- *] {
foreach {f} [glob -nocomplain -directory $d -type {f} -- AAA BBB CCC] {
這邊處理 $f ($f 是完整的檔案路徑,且一定存在,但不保證有權限操作)

}
}

Hank 林 | 2013年11月25日 上午10:11

謝謝您 的幫助 有一些問題想詢問!!

您的兩列程式中 有加上 -- 再您的文章中 是表示代表 switches結束的符號

但擺放在您的行式裡 是有表示什麼意思嗎??

因為我有拿掉在看結果,是沒什麼樣的改變??還是另有其他用處呢?


而且您與匿名朋友的程式,我都有嘗試過!!最大的不同就是能夠像您說的~一定存在!在判斷上面也容易~


dai | 2013年11月25日 上午11:55

用實例來說-types 是檔案系統中合法的檔案名稱,思考下面出了什麼問題?

glob -nocomplain -directory . -types

Hank 林 | 2013年11月26日 上午11:12

作者已經移除這則留言。

Hank 林 | 2013年11月26日 上午11:17

沒有給他一個找尋的 檔案類型選項

dai | 2013年11月26日 下午1:40

嗯~ 這樣說好了!!

你可以在 C:\ 下面 建立一個檔案叫 -types (這是合法的檔案名稱)

現在假設你要用glob找出這個檔案,若沒有加 -- 會寫出這樣的命令

glob -nocomplain -directory . -types

這個命令會讓glob產生誤會,但若加上 -- 就不會了

glob -nocomplain -directory . -- -types



Hank 林 | 2013年11月26日 下午1:50

懂了!!謝謝dai 大的教導 十分感謝!!!!!!!!

Hank 林 | 2013年11月26日 下午6:11

作者已經移除這則留言。

Hank 林 | 2013年11月26日 下午6:13

作者已經移除這則留言。

Hank 林 | 2013年11月27日 下午3:12

如果一個 user 給一個 list
EX
genXXXXX.Tcl {it1 it2 it3 it4 aa}

上面的的 {XXXX}的清單中皆為資料夾的名稱
帶入程式中的$list

有一問題!!

我想讓aa 這個資料夾裏面的檔案內容 貼在 另一新檔案中的尾端

但是user的使用 未必會把 aa 都放在 list的尾端 (照順序處理的話)

那應該要用什麼方式 才能保證 他一定會寫入 檔案中的末端呢?

匿名 | 2013年12月2日 下午4:47

老師您好, 目前寫了一個proc叫display, 其功能為連續輸出A, B, C, D, 則在Linux上的執行畫面如下

source a.tcl
display
A
B
C
D


但其實我想要的是

source a.tcl
display
A
B
C
D

不曉得有沒有方法可以達成呢?? 麻煩老師了

匿名 | 2013年12月2日 下午4:52

老師您好, 目前寫了一個proc叫display, 其功能為連續輸出A, B, C, D, 則在Linux上的執行畫面如下

xxx 1: source a.tcl
xxx 2:display
A
B
C
D
xxx 3:

但其實我想要的是

xxx 1:source a.tcl
xxx 2:display
xxx 3:A
xxx 4:B
xxx 5:C
xxx 6:D

不曉得有沒有方法可以達成呢?? 麻煩老師了

dai | 2013年12月4日 下午9:57

我看不是很懂問題 @@

Hank 林 | 2013年12月5日 上午10:24

dai 大大 看得懂我的問題嗎??

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

其實看不太懂,所以不知道麼回答 ~

Hank 林 | 2013年12月12日 下午3:53

dai 大~不好意思!!我簡單說明好了!!

我給一個list 例如 { A B C D}

A B C D 每一個都是文件檔

每一個 文件檔 都 找出我要的重點之後 寫入 S

需求是 不管 A 檔案 在LIST 中的 哪一個位置 ~

我都希望他是寫入在 S檔案的末端~~

麻煩dai 大 解答~~ 非常謝謝你!!

dai | 2013年12月12日 下午7:03

我假設你只有A檔案是需要最後寫入的其它的則不管順序,那我可以會這樣做
set flist [list A B C D E ....]
foreach f $flist {
if {$f == "A"} {continue}
... 處理 $f 寫入 S
}

處理 A 寫入 S

** 如果LIST中的每一個檔案都有特定的順序,那應該在建立LIST的時候就要依順序排列

匿名 | 2013年12月16日 下午7:21

dai 大您好:
可以將button隱藏嗎?我是想說利用combbox來執行副程式,平常button是隱藏的,當我combox選到特定項目,button才會顯示出來。

dai | 2013年12月18日 下午2:55

假設你button的path是 .btn 那就在combox選取事件觸發時執行下列的程式:

pack forget .btn

以上假設你的.btn是用用pack來管理,若使用grid的話要用下面一行:

grid forget .btn

Kuang Lee | 2014年3月11日 下午5:55

Hi Dai 你好,
最近我正在使用Tcl並使用plotchart的package來進行畫圖, 我上網查尋後必須要安裝tklib 6.0, 但我安裝完後開始要執行程式時確產生錯誤如下
attempt to provide package Plotchart 2.2.2 failed: package Plotchart 2.2.1 provi
ded instead
("package ifneeded Plotchart 2.2.2" script)
invoked from within
"package require Plotchart 2.2.1"
(file "plot_test.tcl" line 8)

想請問該如何解決?

林一二 | 2014年4月28日 下午3:16

這個好像是 plotchart 2.2.2 的錯誤
你把C:\Tcl\lib\teapot\package\tcl\lib\Plotchart2.2.2\plotchart.tcl
該檔案的最後一行 「 package provide Plotchart 2.2.1 」
2.2.1 改成2.2.2 就可以正常運行了

林一二 | 2014年4月28日 下午7:43

若是 額外加的package, 則必需將package 放到對應的路徑,並將pkgIndex.tcl 加入此套件
則系統才知道當使用者 package require時,要到哪裡抓這一包套件

Mary Lee | 2014年6月10日 下午5:23

hi dai你好
請問一下,我把一些指令寫在test.tcl檔案中,可是直接執行tcl檔時,都會出現錯誤,請各位大大指導一下
例,我要執行"ls",當script跑到ls這行時,就會出現下面的錯誤
invalid command name "ls"
while executing
"ls"
(file "test.tcl" line 22)

dai | 2014年6月12日 上午10:54

改成 puts [exec ls] 試試看 ~

AA | 2014年6月18日 上午9:41

Hi~ dai
請問若使用TCLVISA,偶爾會出現錯誤但不是一執行就會發生,需跑一陣子才會有問題,想請Dai 大大建議與指導,
錯誤訊息如:[VI_ERROR_CLOSING_FAILED] Unable to deallocate the previously allocated data structures corresponding to this session or object reference.
[VI_ERROR_CLOSING_FAILED] Unable to deallocate the previously allocated data structures corresponding to this session or object reference.
while executing
"close $vi"
VISA API 是從http://tclvisa.sourceforge.net/ 參考來的,

dai | 2014年6月18日 下午1:06

不好意思幫不上忙,我沒有用過TCLVISA!!

Mary Lee | 2014年7月1日 下午5:35

謝謝喔~~~解決了!!!

Mary Lee | 2014年7月1日 下午5:45

作者已經移除這則留言。

Mary Lee | 2014年7月14日 下午6:31

hi dai大
我寫了1個tcl script "test.tcl",裡面要執行source "xxx.tcl"
xxx.tcl裡面有一些外部指令
直接執行test.tcl時會出現invalid command
我使用exec 〔source "xxx.tcl"〕或是在xxx.tcl的外部指令加上exec,都無法執行
但是如果不透過test.tcl執行滿我直接執行source xxx.tcl是正常的
請問該怎麼辦???

Mary Lee | 2014年7月15日 上午9:12

sorry,我是用wish執行!

dai | 2014年7月16日 上午11:46

嗯 ~ 把錯誤訊息都貼上來比較好了解狀況!!

Mary Lee | 2014年7月18日 下午4:43

hi dai大,這是我的程式碼
======================================================================
::ttk::button .f3.btn3 -text "Start Test" -command {
if {$::value_chk1 == 1} {
puts "start to test \"NVMe Basic Tests\""
source "script.tcl"
} elseif {$::value_chk1 == 0 } {
puts "NVMe Basic Tests : disalbe"
}
if {$::value_chk2 == 0} {puts "NVMe Admin Command w/o Data Transfer : disable"} elseif {$::value_chk1 == 1} {puts "Start to test \"NVMe Admin Command w/o Data Transfer\""}
if {$::value_chk3 == 0} {puts "NVMe Admin Command w/ Data Transfer : disable"} elseif {$::value_chk1 == 1} {puts "Start to test \"NVMe Admin Command w/ Data Transfer\""}
}
======================================================================

錯誤訊息
======================================================================
start to test "NVMe Basic Tests"
invalid command name "device list"
while executing
"exec C:/Niagara-field/Tcl/bin/wish.EXE test.tcl"
("uplevel" body line 1)
invoked from within
"uplevel 1 exec $new [lrange $args 1 end]"
invoked from within
"if {[string compare {} $new]} {
set errorCode $savedErrorCode
set errorInfo $savedErrorInfo
return [up..."
invoked from within
"if {![info exists auto_noexec]} {
set new [auto_execok $name]
if {[string compare {} $new]} {
set errorCode $s..."
invoked from within
"if {[info level] == 1 && [string match {} [info script]] && [info exists tcl_interactive] && $tcl_interactive} {
if {![info exists auto_noexe..."
(procedure "tcl_unknown" line 66)
invoked from within
"wish test.tcl"
("uplevel" body line 1)
invoked from within
"uplevel #0 {wish test.tcl}"
======================================================================

Mary Lee | 2014年7月18日 下午4:47

公司有1套軟體是用tk寫的,這套軟體有提供一些指令
當我把button .f3.btn3勾選起來時,$::value_chk1 == 1,執行到"source "script.tcl""就會出現錯誤
script.tcl內容裡的指令是我的軟體提供的
如果是直接在console單獨執行source "script.tcl"是沒有問題的,但一放進script裡就出現錯誤訊息了???
跪求各位大大幫我看一下,謝謝!!!

dai | 2014年7月18日 下午10:54

invalid command name "device list"

重點在上面一行,說是找不到 "device list" 這個命令的名稱

猜想也許你公司的軟體並沒有這個 "device list" 但是有 "device" 的命令 且可以接受第一個參數是 "list"

若猜想的沒有錯問題應該是發生在 script.tcl 裡面,某行程式直接或間接(變數代換)不小心執行了 "device list" 這個不正確的命令。

若不是這樣的話,另一種可能性是你在使用console source script.tcl時,script.tcl會去偵測是否在「interactive」執行,若是的話,可能會去執行一些載入"device list" 命令的程式片段。

Mary Lee | 2014年7月21日 上午11:31

dai大你好,我是寫程式的新手,所以有些問題常會詞不達意....請見諒
猜想也許你公司的軟體並沒有這個 "device list" 但是有 "device" 的命令 且可以接受第一個參數是 "list"~~~>你的解釋是對的

若猜想的沒有錯問題應該是發生在 script.tcl 裡面,某行程式直接或間接(變數代換)不小心執行了 "device list" 這個不正確的命令。
~~~>我有試過直接在console執行 "source test.tcl",這樣去run script.tcl是沒有問題的,所以我會覺得我的script.tcl內容是對的
test.tcl
****************
source script.tcl
****************

若不是這樣的話,另一種可能性是你在使用console source script.tcl時,script.tcl會去偵測是否在「interactive」執行,若是的話,可能會去執行一些載入"device list" 命令的程式片段。
~~~>是否在「interactive」執行,使用source或wish執行會在不同模式下執行嗎????

dai | 2014年7月21日 下午2:46

嗯 ~ 猜想你的script.tcl裡面會有 if {..判斷是否在interactive執行....} { 這裡面的程式會有處理 device list 相關的命令,問題應該就是發生在這邊}
** 第二個大括號的程式內容讓「interactive」模式下對device list有不一樣的處理行為

Mary Lee | 2014年7月21日 下午4:41

其實我的script.tcl的內容只有1行指令~~~沒有任何判斷耶...
script.tcl
******************
device list
******************

dai | 2014年7月21日 下午10:41

嗯 ~ 我在你的錯誤訊息中有看到
if {[info level] == 1 && [string match {} [info script]] && [info exists tcl_interactive] && $tcl_interactive} {.....}
也許要找出這一行是在哪產生的

jimmy | 2014年7月22日 下午1:32

那一段code可能是tkcon.tcl裡的tcl_unknow

dai | 2014年7月23日 下午6:40

如果是由 wish test.tcl 來啟動 .... 應該不會跟tkcon有關??

或是說錯誤訊息是由 tkcon 中 source test.tcl 產生的??

林政邦 | 2014年8月20日 下午1:37

請問一下,該如何才能編譯成執行檔後的中文字可以順利顯示呢?
比如說我建立了一個test.tcl
test.tcl內容如下

button .b -text "按鈕"
pack .b

然後我使用tclkit 及 sdx.kit及下列指令…編譯成執行檔
tclkit.exe sdx.kit qwrap test.tcl
tclkit.exe sdx.kit unwrap test.kit
tclkit.exe sdx.kit wrap test.exe -runtime tclkit1.exe

但執行test.exe時都會顯示亂碼

林政邦 | 2014年8月20日 下午2:28

補充一下,平時程式在ezdit上面開發…並沒有中英文的問題
但是產生執行檔時就一切都不正常了

dai | 2014年8月21日 上午10:30

請參考本站 教學文件 => Tcl/Tk常見問題 Q1 及 Q2

林政邦 | 2014年8月21日 下午4:43

可以顯示中文了,感謝您的幫忙
謝謝

jimmy | 2014年11月11日 上午9:32

請問能不能在沒有focus視窗元件的情況下bind鍵盤的輸入,目前我是使用Linux,
現在的作法是直接讀取 /dev/input/eventX , 再配合 fileevent 去讀出鍵盤的事件
想知道是否有更方便的作法,謝謝

dai | 2014年11月12日 下午9:51

嗯~~沒有這樣用過!!

NightGenie | 2014年11月19日 下午5:10

Hi Dai~
不好意思又來詢問了,請問有關tcom控制excel時,用Find尋找資料時如何完整配對,比如我要找6這個值或文字,但是2006也會算在內,導致我取得Row時誤判.
翻了MSDN,Find內有很多選擇性參數可下
.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
其中What是要尋找的值,
而tcl只用了 $cells Find "6"
我試過用巨集找答案,而巨集是在LookAt這個參數的值為xlWhole,
所以我才想怎麼也能下這些參數.

匿名 | 2014年12月18日 下午9:15

我想請教一下怎麼用TCL寫一個telnet並用expect/send互動.
我是在win7, 大概是寫這樣
package require Expect
spawn telnet xxx.xxx.xxx.xxx
expect "login"
send "1234\r"
但畫面都不動

NightGenie | 2014年12月22日 下午5:12

給樓上:
改用
expect -i $spawn_id "login"
send -i $spawn_id "1234\r"
試看看.

匿名 | 2014年12月23日 下午5:51

謝謝!!!

Hu Mike | 2014年12月29日 下午6:32

可以否請教Dai大大,我想要讓文字能夠不停更新,但發現她好像只會顯示最後完成的狀態,不知道這方面要如何實作?
我的目前的作法是:
label .label1 -text "0"
place .label1 -x 0 -y 0
button .profor.btn1 -text "Start"
bind .profor.btn1 <1> {
set start 0
while {$start < 10} {
.label1 configure -text "$start"
set test1 "/bin/sleep 1"
set test2 [eval exec $test1]
incr start 1
}
}

C.A | 2015年1月22日 下午8:04

Hi Dai
請教一個問題,目前從.txt檔填資料到excel的表格中,excel的行是用英文字來表示,所以我用acsii來轉成數字來達到自動遞增換格,可是到行是AA時就會有問題,請問這要如何解。
麻煩指導一下,謝謝

dai | 2015年1月22日 下午9:27

#假設 A 是1
set idx 0
set i 0
foreach {c} [lreverse [split "AA" ""]] {
binary scan $c cu val
set idx [expr $idx + int(($val - 64) * pow(26,$i))]
incr i
}
puts $idx

匿名 | 2015年1月26日 下午7:52

Hi Dai
最近遇到個問題就是我有一份文字檔案假設為ProgectList.txt內容為
Ongoing AD_Project 1000
Ongoing BD_Project 1001
Ongoing CD_Project 1002
Ongoing DD_Project 1003
Pending AS_Project 7000
Pending BS_Project 7001
Pending CS_Project 7002
Pending DS_Project 7003
...
..
.
而我希望可以利用TCL將他排列組合為
Ongoing AD_Project 1000
Pending AS_Project 7000
Ongoing BD_Project 1001
Pending BS_Project 7001
...
..
.
就是 Ongoing的下面就是Pending這樣..
不曉得可否實現
謝謝您

dai | 2015年1月27日 上午9:08

若檔案不大,就把整個文件檔以行為單位讀進Tcl的2個list中,一個list專門存Ongoing開頭的行,另一個專門存Pending開頭的行,然後再把2個list內的itam交錯寫入原來的檔案中即可。

匿名 | 2015年1月28日 上午9:57

Hi Dai大哥
想了一下但這邊不知道我該如何只利用關鍵字,然後讓他抓取整行的方式,
例如我的關鍵字是"Ongoing AD",當我抓到Ongoing AD的字串時讓他抓取,Ongoing AD_Project 1000
有Ongoing AD_Project 1000的一整行字串出來

dai | 2015年1月29日 下午5:10

set Ongoing [list]
set Pending [list]
set fd [open a.txt r]
while {![eof $fd]} {
set line [gets $fd]
if {[string first "Ongoing" $line] == 0} {lappend Ongoing $line}
if {[string first "Pending" $line] == 0} {lappend Pending $line}
}
close $fd

puts $Ongoing
puts $Pending

# 以下交錯出輸 $Ongoing 及 $Pending 的項目

廖書賢 | 2015年2月9日 上午11:53

Hi Dai大大

想請教您一下 我list 裡有 123av1,123bv1,123cv1

set fd [open list r]

while {[gets $fd x]>=0} {

switch -glob -- $x {
*gate_floating* -
*pathchk* -
*svdb* -
*plvs.rep.ext* {continue}
"*123av*" {set g $x}
#但是到這邊做判斷的時候只有bv能執行,其他的都會有錯誤不能 set 到g
能給小第一點意見嗎?感謝。
}



file copy -force $g ./report/.
}

close $fd

匿名 | 2015年2月13日 下午12:40

Dear Dai大大
想問一下 如下的程式我遇到了點問題(下面這段程式已經在一個while迴圈內了)
現在我想要做的是將$ddd $ggg做比對如果 相同會執行puts good 如果不同了話我該怎麼回到 set line2 [gets $file2]
這一行繼續抓取file2這個檔案裡面的下一筆資料,這樣循環直到抓到相同的字串呢.....
set line2 [gets $file2]
set eee [string first "def " "$line2"]
set fff [string first " PL" "$line2"]
set ggg [string range "$line2" "$eee" "$fff"]
set hhh [string compare $ddd $ggg]
if [$hhh == "0"] [puts goods]

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

Hi Dai大大,又來請問一個問題,請問canvas可以設定消除他的邊框嗎?
. configure -bg white
canvas .img1 -width 50 -height 50 -bg white
place .img1 -x 10 -y 10
我這邊一直都有淡淡的邊框說。

匿名 | 2016年5月26日 上午9:34

我用Windows 7執行TCL SCRIPT時出現 "Wish Application已經停止運作",這是為甚麼??
我可以再WISH CONSOLE執行命令啊!!

我發現TCLSH有跳出child killed: segmentation violation

匿名 | 2017年6月16日 上午11:12

你好冒昧請教一下, 目前我是使用 .bat 來呼叫 tcl, 舉例來說, bat的內容會寫這樣:tclsh84 Monitor.tcl.
想請教一下如果我想在呼叫的時候順便傳遞參數給 tcl, 我該如何做呢?

留下您的意見

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