Tcl-Tk 快速指南



Tcl - 概述

Tcl 是 **工具命令語言** 的縮寫形式。加州大學伯克利分校的 John Ousterhout 設計了它。它結合了指令碼語言及其自己的直譯器,該直譯器嵌入到我們用它開發的應用程式中。

Tcl 最初是為 Unix 開發的。然後移植到 Windows、DOS、OS/2 和 Mac OSX。Tcl 與其他 Unix shell 語言非常相似,例如 Bourne Shell (Sh)、C Shell (csh)、Korn Shell (sh) 和 Perl。

它旨在為程式提供與其他程式互動的能力,以及充當可嵌入直譯器的能力。即使最初的目標是使程式能夠互動,您也可以找到用 Tcl/Tk 編寫的完整應用程式。

Tcl 的特性

Tcl 的特性如下:

  • 縮短開發時間。

  • 透過整合 TK,提供強大且簡單使用者介面工具包。

  • 一次編寫,隨處執行。它可以在 Windows、Mac OS X 和幾乎所有 Unix 平臺上執行。

  • 對於有經驗的程式設計師來說,入門非常容易;因為該語言非常簡單,他們可以在幾個小時或幾天內學會 Tcl。

  • 您可以輕鬆地使用 Tcl 擴充套件現有應用程式。此外,還可以將 Tcl 包含到 C、C++ 或 Java 中,反之亦然。

  • 擁有強大的網路功能集。

  • 最後,它是一個開源的、免費的,並且可以用於商業應用程式,沒有任何限制。

應用

Tcl 是一種通用語言,您可以在任何地方找到 Tcl。它包括:

  • 通常由資料庫支援的可擴充套件網站。
  • 使用 TclHttpd 構建的高效能 Web 伺服器。
  • 使用 CGI 的 Tcl 網站。
  • 桌面 GUI 應用程式。
  • 嵌入式應用程式。

Tcl - 環境設定

本地環境設定

如果您希望為 Tcl 設定環境,則需要在您的計算機上安裝以下兩個軟體應用程式:

  • 文字編輯器
  • Tcl 直譯器。

文字編輯器

這將用於鍵入您的程式。一些文字編輯器的示例包括 Windows 記事本、OS Edit 命令、Brief、Epsilon、EMACS 和 vim 或 vi。

文字編輯器的名稱和版本在不同的作業系統上可能有所不同。例如,Notepad 將用於 Windows,而 vim 或 vi 既可以用於 Windows,也可以用於 Linux 或 UNIX。

使用文字編輯器建立的檔案稱為原始檔,其中包含程式原始碼。Tcl 程式的原始檔以副檔名 **".tcl"** 命名。

在開始程式設計之前,請確保您已準備好一個文字編輯器,並且您有足夠的經驗來編寫計算機程式、將其儲存到檔案中、構建它,最後執行它。

Tcl 直譯器

它只是一個小型程式,使您能夠鍵入 Tcl 命令並逐行執行它們。如果遇到錯誤,它會停止執行 tcl 檔案,這與執行完整的編譯器不同。

讓我們建立一個名為 helloWorld.tcl 的檔案,如下所示。我們將使用它作為第一個程式,在您選擇的平臺上執行。

#!/usr/bin/tclsh

puts "Hello World!" 

在 Windows 上安裝

從提供的 Active Tcl 二進位制檔案列表中下載適用於 Windows 的最新版本 安裝程式。Active Tcl 社群版可免費用於個人使用。

執行下載的可執行檔案以安裝 Tcl,這可以透過按照螢幕上的說明進行。

現在,我們可以透過使用 'cd' 命令切換到包含該檔案的資料夾,然後使用以下步驟執行程式來構建和執行 Tcl 檔案,例如 helloWorld.tcl

C:\Tcl> tclsh helloWorld.tcl

我們可以看到以下輸出。

C:\Tcl> helloWorld

C:\Tcl 是我用來儲存示例的資料夾。您可以將其更改為您儲存 Tcl 程式的資料夾。

在 Linux 上安裝

大多數 Linux 作業系統都內建了 Tcl,您可以在這些系統上立即開始使用。如果不可用,您可以使用以下命令下載並安裝 Tcl-Tk。

$ yum install tcl tk

現在,我們可以透過使用 'cd' 命令切換到包含該檔案的資料夾,然後使用以下步驟執行程式來構建和執行 Tcl 檔案,例如 helloWorld.tcl:

$ tclsh helloWorld.tcl

我們可以看到以下輸出:

$ hello world

在基於 Debian 的系統上安裝

如果您的作業系統中沒有,您可以使用以下命令下載並安裝 Tcl-Tk:

$ sudo apt-get install tcl tk

現在,我們可以透過使用 'cd' 命令切換到包含該檔案的資料夾,然後使用以下步驟執行程式來構建和執行 Tcl 檔案,例如 helloWorld.tcl:

$ tclsh helloWorld.tcl

我們可以看到以下輸出:

$ hello world

在 Mac OS X 上安裝

從提供的 Active Tcl 二進位制檔案列表中下載適用於 Mac OS X 的最新版本 軟體包。Active Tcl 社群版可免費用於個人使用。

執行下載的可執行檔案以安裝 Active Tcl,這可以透過按照螢幕上的說明進行。

現在,我們可以透過使用 'cd' 切換到包含該檔案的資料夾,然後使用以下步驟執行程式來構建和執行 Tcl 檔案,例如 helloWorld.tcl:

$ tclsh helloWorld.tcl

我們可以看到以下輸出:

$ hello world

從原始檔安裝

當二進位制軟體包不可用時,您可以選擇從原始檔安裝。通常建議對 Windows 和 Mac OS X 使用 Tcl 二進位制檔案,因此僅在下面顯示了基於 unix 系統上的原始碼編譯。

  • 下載 原始檔。

  • 現在,切換到下載的資料夾後,使用以下命令進行提取、編譯和構建。

$ tar zxf tcl8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure —prefix=/opt —enable-gcc
$ make
$ sudo make install

**注意** - 請確保將檔名更改為您在上面給出的命令 1 和 2 中下載的版本。

Tcl - 特殊變數

在 Tcl 中,我們將某些變數分類為特殊變數,它們具有預定義的用法/功能。特殊變數的列表如下所示。

序號 特殊變數 & 描述
1

argc

指命令列引數的數量。

2

argv

指包含命令列引數的列表。

3

argv0

指正在解釋的檔案的檔名或我們用來呼叫指令碼的名稱。

4

env

用於表示環境變數元素的陣列。

5

errorCode

提供上次 Tcl 錯誤的錯誤程式碼。

6

errorInfo

提供上次 Tcl 錯誤的堆疊跟蹤。

7

tcl_interactive

分別透過將其設定為 1 和 0 來在互動模式和非互動模式之間切換。

8

tcl_library

用於設定標準 Tcl 庫的位置。

9

tcl_pkgPath

提供通常安裝軟體包的目錄列表。

10

tcl_patchLevel

指 Tcl 直譯器的當前補丁級別。

11

tcl_platform

用於表示包含 byteOrder、machine、osVersion、platform 和 os 等物件的元素陣列。

12

tcl_precision

指精度,即在將浮點數轉換為字串時要保留的位數。預設值為 12。

13

tcl_prompt1

指主提示符。

14

tcl_prompt2

指帶有無效命令的輔助提示符。

15

tcl_rcFileName

提供使用者特定的啟動檔案。

16

tcl_traceCompile

用於控制位元組碼編譯的跟蹤。使用 0 表示無輸出,1 表示摘要,2 表示詳細。

17

tcl_traceExec

用於控制位元組碼執行的跟蹤。使用 0 表示無輸出,1 表示摘要,2 表示詳細。

18

tcl_version

返回 Tcl 直譯器的當前版本。

上述特殊變數對 Tcl 直譯器具有特殊含義。

使用 Tcl 特殊變數的示例

讓我們看看一些特殊變數的示例。

Tcl 版本

#!/usr/bin/tclsh

puts $tcl_version

執行程式時,您將獲得如下所示的類似輸出:

8.6

Tcl 環境路徑

#!/usr/bin/tclsh

puts $env(PATH)

執行程式時,您將獲得如下所示的類似輸出:

/home/cg/root/GNUstep/Tools:/usr/GNUstep/Local/Tools:/usr/GNUstep/
System/Tools:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/webmaster/.local/bin:/
home/webmaster/bin:/usr/local/scriba/bin:/usr/local/smlnj/
bin:/usr/local/bin/std:/usr/local/bin/extra:/usr/local/fantom/bin:/usr/
local/dart/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/opt/mono/
bin:/opt/mono/lib/mono/4.5:/usr/local/bin:.:/usr/libexec/sdcc:/usr/local/
icon-v950/bin:/usr/local/mozart/bin:/opt/Pawn/bin:/opt/jdk1.7.0_75/bin:/
opt/jdk1.7.0_75/jre/bin:/opt/pash/Source/PashConsole/bin/Debug/

Tcl 軟體包路徑

#!/usr/bin/tclsh

puts $tcl_pkgPath

執行程式時,您將獲得如下所示的類似輸出:

/usr/lib64/tcl8.6 /usr/share/tcl8.6 /usr/lib64/tk8.6 /usr/share/tk8.6

Tcl 庫

#!/usr/bin/tclsh

puts $tcl_library

執行程式時,您將獲得如下所示的類似輸出:

/usr/share/tcl8.6

Tcl 補丁級別

#!/usr/bin/tclsh

puts $tcl_patchLevel

執行程式時,您將獲得如下所示的類似輸出:

8.6.6

Tcl 精度

#!/usr/bin/tclsh

puts $tcl_precision

執行程式時,您將獲得如下所示的類似輸出:

0

Tcl 啟動檔案

#!/usr/bin/tclsh

puts $tcl_rcFileName

執行程式時,您將獲得如下所示的類似輸出:

~/.tclshrc

Tcl - 基本語法

Tcl 非常容易學習,讓我們開始建立我們的第一個 Tcl 程式吧!

第一個 Tcl 程式

讓我們編寫一個簡單的 Tcl 程式。所有 Tcl 檔案都將具有副檔名,即 .tcl。因此,將以下原始碼放入 test.tcl 檔案中。

#!/usr/bin/tclsh

puts "Hello, World!" 

假設 Tcl 環境已正確設定;讓我們切換到檔案目錄,然後使用以下命令執行程式:

$ tclsh test.tcl

我們將獲得以下輸出:

Hello, World!

現在讓我們看看 Tcl 程式的基本結構,以便您更容易理解 Tcl 語言的基本構建塊。在 Tcl 中,我們使用換行符或分號來終止上一行程式碼。但是,如果您為每個命令使用換行符,則分號不是必需的。

註釋

註釋就像 Tcl 程式中的幫助文字,直譯器會忽略它們。可以使用開頭處的雜湊 (#) 符號編寫註釋。

#!/usr/bin/tclsh

# my first program in Tcl
puts "Hello World!" 

執行上述程式碼時,會產生以下結果:

Hello World!

多行或塊註釋使用帶有條件 '0' 的 'if' 編寫。下面顯示了一個示例。

#!/usr/bin/tclsh

if 0 {
   my first program in Tcl program
   Its very simple
}
puts "Hello World!" 

執行上述程式碼時,會產生以下結果:

Hello World!

內聯註釋使用 ;#。下面給出了一個示例。

#!/usr/bin/tclsh

puts "Hello World!" ;# my first print in Tcl program

執行上述程式碼時,會產生以下結果:

Hello World!

識別符號

Tcl 識別符號是用於標識變數、函式或任何其他使用者定義專案的名稱。識別符號以字母 A 到 Z 或 a 到 z 或下劃線 (_) 開頭,後跟零個或多個字母、下劃線、美元符號 ($) 和數字 (0 到 9)。

Tcl 不允許在識別符號中使用諸如 @、% 等標點符號。Tcl 是一種區分大小寫的語言。因此,Manpowermanpower 在 Tcl 中是兩個不同的識別符號。以下是可接受的識別符號的一些示例:

mohd       zara    abc   move_name  a_123
myname50   _temp   j     a23b9      retVal

Tcl 中的空格

僅包含空格(可能還有註釋)的行被稱為空行,Tcl 直譯器會完全忽略它。

空格是 Tcl 中用來描述空格、製表符、換行符和註釋的術語。空格將語句的一部分與另一部分分隔開來,並使直譯器能夠識別語句中一個元素(例如 puts)的結束位置和下一個元素的開始位置。因此,在以下語句中:

#!/usr/bin/tclsh

puts "Hello World!" 

“puts” 和 "Hello World!" 之間必須至少有一個空格字元(通常是空格),以便直譯器能夠區分它們。另一方面,在以下語句中:

#!/usr/bin/tclsh

puts [expr 3 + 2] ;# print sum of the 3 and 2

執行上述程式碼時,會產生以下結果:

5

3 和 + 之間,或者 + 和 2 之間不需要空格字元;儘管如此,為了可讀性,您可以隨意新增一些空格。

Tcl - 命令

如您所知,Tcl 是一種工具命令語言,命令是該語言最核心的部分。Tcl 命令內置於語言中,每個命令都有其自身預定義的功能。這些命令構成了語言的保留字,不能用於其他變數命名。使用這些 Tcl 命令的優勢在於,您可以為任何這些命令定義自己的實現,以替換原始的內建功能。

每個 Tcl 命令都會驗證輸入,從而減少了直譯器的負擔。

Tcl 命令實際上是一個單詞列表,第一個單詞表示要執行的命令。接下來的單詞表示引數。為了將單詞組合成單個引數,我們將多個單詞用 "" 或 {} 括起來。

Tcl 命令的語法如下:

commandName argument1 argument2 ... argumentN

讓我們看一個簡單的 Tcl 命令示例:

#!/usr/bin/tclsh

puts "Hello, world!"

執行上述程式碼時,會產生以下結果:

Hello, world!

在上面的程式碼中,‘puts’ 是 Tcl 命令,"Hello World" 是引數 1。如前所述,我們使用了 "" 來組合兩個單詞。

讓我們再看一個包含兩個引數的 Tcl 命令示例:

#!/usr/bin/tclsh

puts stdout "Hello, world!"

執行上述程式碼時,會產生以下結果:

Hello, world!

在上面的程式碼中,‘puts’ 是 Tcl 命令,‘stdout’ 是引數 1,"Hello World" 是引數 2。在這裡,stdout 使程式能夠在標準輸出裝置上列印。

命令替換

在命令替換中,使用方括號來評估方括號內的指令碼。下面顯示了一個簡單的加兩個數字的示例:

#!/usr/bin/tclsh

puts [expr 1 + 6 + 9]

執行上述程式碼後,將產生以下結果:

16

變數替換

在變數替換中,在變數名前使用 $,這將返回變數的內容。下面顯示了一個將值賦給變數並列印它的簡單示例。

#!/usr/bin/tclsh

set a 3
puts $a

執行上述程式碼時,會產生以下結果:

3

反斜槓替換

這些通常稱為轉義序列;每個反斜槓後跟一個字母,每個字母都有其自身的含義。下面顯示了一個換行符替換的簡單示例:

#!/usr/bin/tclsh

puts "Hello\nWorld"

執行上述程式碼時,會產生以下結果:

Hello
World

Tcl - 資料型別

Tcl 的基本資料型別是字串,並且我們經常可以在 Tcl 中將字串視為唯一的語言。這些基本資料型別依次建立列表和關聯陣列的複合資料型別。在 Tcl 中,資料型別不僅可以表示簡單的 Tcl 物件,還可以表示複雜的物件,例如控制代碼、圖形物件(主要是小部件)和 I/O 通道。讓我們詳細瞭解上述每個方面。

簡單的 Tcl 物件

在 Tcl 中,無論是整數、布林值、浮點數還是字串。當您想要使用變數時,可以直接為其賦值,在 Tcl 中沒有宣告步驟。這些不同型別的物件可以有內部表示形式。它可以在需要時將一種資料型別轉換為另一種資料型別。為變數賦值的語法如下:

#!/usr/bin/tclsh

set myVariable 18
puts $myVariable

執行上述程式碼時,會產生以下結果:

18

上述語句將建立一個名為 myVariable 的變數,並將其儲存為字串,即使我們沒有使用雙引號。現在,如果我們嘗試對變數進行算術運算,它會自動轉換為整數。下面顯示了一個簡單的示例:

#!/usr/bin/tclsh

set myVariable 18
puts [expr $myVariable + 6 + 9]

執行上述程式碼時,會產生以下結果:

33

需要注意的一點是,這些變數沒有任何預設值,並且必須在使用之前為其賦值。

如果我們嘗試使用 puts 列印,則該數字將轉換為正確的字串。擁有內部和外部兩種表示形式,有助於 Tcl 比其他語言更容易地建立複雜的資料結構。此外,由於其動態物件特性,Tcl 更有效率。

字串表示

與其他語言不同,在 Tcl 中,如果只有一個單詞,則無需包含雙引號。例如:

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

執行上述程式碼時,會產生以下結果:

hello

當我們想要表示多個字串時,可以使用雙引號或花括號。如下所示:

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

執行上述程式碼時,會產生以下結果:

hello world
hello world

列表

列表只不過是一組元素。可以使用雙引號或花括號括起來的一組單詞來表示一個簡單的列表。下面顯示了一個簡單的列表:

#!/usr/bin/tclsh

set myVariable {red green blue}
puts [lindex $myVariable 2]
set myVariable "red green blue"
puts [lindex $myVariable 1]

執行上述程式碼時,會產生以下結果:

blue
green

關聯陣列

關聯陣列的索引(鍵)不一定是整數。它通常是一個充當鍵值對的字串。下面顯示了一個簡單的示例:

#!/usr/bin/tclsh

set  marks(english) 80
puts $marks(english)
set  marks(mathematics) 90
puts $marks(mathematics)

執行上述程式碼時,會產生以下結果:

80
90

控制代碼

Tcl 控制代碼通常用於表示檔案和圖形物件。這些可以包括網路請求的控制代碼,以及其他通道,例如序列埠通訊、套接字或 I/O 裝置。以下是一個建立檔案控制代碼的示例。

set myfile [open "filename" r]

您將在Tcl 檔案 I/O章節中看到有關檔案的更多詳細資訊。

Tcl - 變數

在 Tcl 中,沒有變數宣告的概念。一旦遇到新的變數名,Tcl 就會定義一個新的變數。

變數命名

變數名可以包含任何字元和長度。您甚至可以透過將變數用花括號括起來包含空格,但這並不推薦。

set 命令用於為變數賦值。set 命令的語法為:

set variableName value

下面顯示了一些變數示例:

#!/usr/bin/tclsh

set variableA 10
set {variable B} test
puts $variableA
puts ${variable B}

執行上述程式碼時,會產生以下結果:

10
test

如您在上述程式中看到的,$variableName 用於獲取變數的值。

動態型別

Tcl 是一種動態型別語言。變數的值可以在需要時動態轉換為所需型別。例如,儲存為字串的數字 5 在進行算術運算時將轉換為數字。如下所示:

#!/usr/bin/tclsh

set variableA "10"
puts $variableA
set sum [expr $variableA +20];
puts $sum

執行上述程式碼時,會產生以下結果:

10
30

數學表示式

如您在上述示例中看到的,expr 用於表示數學表示式。Tcl 的預設精度為 12 位數字。為了獲得浮點數結果,我們應該至少新增一位小數。一個簡單的示例解釋了上述內容。

#!/usr/bin/tclsh

set variableA "10"
set result [expr $variableA / 9];
puts $result
set result [expr $variableA / 9.0];
puts $result
set variableA "10.0"
set result [expr $variableA / 9];
puts $result

執行上述程式碼時,會產生以下結果:

1
1.1111111111111112
1.1111111111111112

在上面的示例中,您可以看到三種情況。在第一種情況下,被除數和除數都是整數,我們得到一個整數作為結果。在第二種情況下,只有除數是小數,在第三種情況下,被除數是小數。在第二種和第三種情況下,我們都得到一個小數作為結果。

在上面的程式碼中,您可以使用 tcl_precision 特殊變數更改精度。如下所示:

#!/usr/bin/tclsh

set variableA "10"
set tcl_precision 5
set result [expr $variableA / 9.0];
puts $result

執行上述程式碼時,會產生以下結果:

1.1111

Tcl - 運算子

運算子是一個符號,它告訴編譯器執行特定的數學或邏輯操作。Tcl 語言富含內建運算子,並提供以下型別的運算子:

  • 算術運算子
  • 關係運算符
  • 邏輯運算子
  • 位運算子
  • 三元運算子
Types of Operators

本章將逐一解釋算術、關係、邏輯、位和三元運算子。

算術運算子

下表顯示了 Tcl 語言支援的所有算術運算子。假設變數‘A’儲存 10,變數‘B’儲存 20,則:

顯示示例

運算子 描述 示例
+ 將兩個運算元相加 A + B 將得到 30
- 從第一個運算元中減去第二個運算元 A - B 將得到 -10
* 將兩個運算元相乘 A * B 將得到 200
/ 將分子除以分母 B / A 將得到 2
% 模運算子和整數除法後的餘數 B % A 將得到 0

關係運算符

下表顯示了 Tcl 語言支援的所有關係運算符。假設變數A儲存 10,變數B儲存 20,則:

顯示示例

運算子 描述 示例
== 檢查兩個運算元的值是否相等,如果相等則條件為真。 (A == B) 為假。
!= 檢查兩個運算元的值是否不相等,如果不相等則條件為真。 (A != B) 為真。
> 檢查左側運算元的值是否大於右側運算元的值,如果是則條件為真。 (A > B) 為假。
< 檢查左側運算元的值是否小於右側運算元的值,如果是則條件為真。 (A < B) 為真。
>= 檢查左側運算元的值是否大於或等於右側運算元的值,如果是則條件為真。 (A >= B) 為假。
<= 檢查左側運算元的值是否小於或等於右側運算元的值,如果是則條件為真。 (A <= B) 為真。

邏輯運算子

下表顯示了 Tcl 語言支援的所有邏輯運算子。假設變數A儲存 1,變數B儲存 0,則:

顯示示例

運算子 描述 示例
&& 稱為邏輯 AND 運算子。如果兩個運算元均非零,則條件為真。 (A && B) 為假。
|| 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 (A || B) 為真。
! 稱為邏輯 NOT 運算子。用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其為假。 !(A && B) 為真。

位運算子

位運算子對位進行操作,並執行逐位運算。&、| 和 ^ 的真值表如下:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假設 A = 60;B = 13;現在以二進位制格式,它們將如下所示:

A = 0011 1100

B = 0000 1101

----------------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

Tcl 語言支援的位運算子列在下表中。假設變數A儲存 60,變數B儲存 13,則:

顯示示例

運算子 描述 示例
& 二進位制 AND 運算子將位複製到結果中,如果它存在於兩個運算元中。 (A & B) 將得到 12,即 0000 1100
| 二進位制 OR 運算子將位複製到結果中,如果它存在於任何一個運算元中。 (A | B) 將得到 61,即 0011 1101
^ 二進位制 XOR 運算子將位複製到結果中,如果它在一個運算元中設定,但在另一個運算元中未設定。 (A ^ B) 將得到 49,即 0011 0001
<< 二進位制左移運算子。左側運算元的值向左移動右側運算元指定的位數。 A << 2 將得到 240,即 1111 0000
>> 二進位制右移運算子。左側運算元的值向右移動右側運算元指定的位數。 A >> 2 將得到 15,即 0000 1111

三元運算子

顯示示例

運算子 描述 示例
? : 三元運算子 如果條件為真?則值為 X:否則值為 Y

Tcl 中的運算子優先順序

運算子優先順序決定了表示式中項的組合方式。這會影響表示式的計算方式。某些運算子的優先順序高於其他運算子;例如,乘法運算子的優先順序高於加法運算子。

例如:x = 7 + 3 * 2;這裡,x 被賦值為 13,而不是 20,因為運算子 * 的優先順序高於 +,所以它首先與 3 * 2 相乘,然後加到 7 中。

這裡,優先順序最高的運算子出現在表格的頂部,優先順序最低的出現在底部。在一個表示式中,優先順序較高的運算子將首先被計算。

顯示示例

類別 運算子 結合性
一元運算子 + - 從右到左
乘法運算子 * / % 從左到右
加法運算子 + - 從左到右
移位運算子 << >> 從左到右
關係運算符 < <= > >= 從左到右
按位與運算子 & 從左到右
按位異或運算子 ^ 從左到右
按位或運算子 | 從左到右
邏輯與運算子 && 從左到右
邏輯或運算子 || 從左到右
三元運算子 ?: 從右到左

Tcl - 決策

決策結構要求程式設計師指定一個或多個條件,由程式進行評估或測試,以及在確定條件為真時要執行的語句或語句,以及可選地,在確定條件為假時要執行的其他語句。

以下是大多數程式語言中常見的決策結構的一般形式:

Decision Making

Tcl 語言在內部使用 expr 命令,因此我們不需要顯式地使用 expr 語句。

Tcl 語言提供了以下型別的決策語句:

序號 語句 & 描述
1 if 語句

一個 'if' 語句由一個布林表示式後跟一個或多個語句組成。

2 if...else 語句

一個 'if' 語句後面可以跟一個可選的 'else' 語句,當布林表示式為假時執行。

3 巢狀 if 語句

您可以在另一個 'if' 或 'else if' 語句中使用一個 'if' 或 'else if' 語句。

4 switch 語句

一個 switch 語句允許將一個變數與一個值的列表進行相等性測試。

5 巢狀 switch 語句

您可以在另一個 switch 語句中使用一個 switch 語句。

? : 運算子

我們在上一章中介紹了 條件運算子 ? :,它可以用來替換 if...else 語句。它具有以下一般形式:

Exp1 ? Exp2 : Exp3;

其中 Exp1、Exp2 和 Exp3 是表示式。注意冒號的使用和位置。

“?表示式”的值如下確定:Exp1 被計算。如果為真,則計算 Exp2 並將其作為整個“?表示式”的值。如果 Exp1 為假,則計算 Exp3 並將其值作為表示式的值。下面顯示了一個示例。

#!/usr/bin/tclsh

set a 10;
set b [expr $a == 1 ? 20: 30]
puts "Value of b is $b\n"
set b [expr $a == 10 ? 20: 30]
puts "Value of b is $b\n" 

當您編譯並執行上述程式時,它會產生以下結果:

Value of b is 30
Value of b is 20

Tcl - 迴圈

可能存在這樣一種情況,您需要多次執行一段程式碼。通常,語句按順序執行:函式中的第一個語句首先執行,然後是第二個語句,依此類推。

程式語言提供了各種控制結構,允許更復雜的執行路徑。

迴圈語句允許我們多次執行一個語句或一組語句,以下是大多數程式語言中迴圈語句的一般形式:

Loop Architecture

Tcl 語言提供了以下型別的迴圈來處理迴圈需求。

序號 迴圈型別 & 描述
1 while 迴圈

在給定條件為真的情況下重複一個語句或一組語句。它在執行迴圈體之前測試條件。

2 for 迴圈

多次執行一系列語句,並縮寫管理迴圈變數的程式碼。

3 巢狀迴圈

您可以在任何其他 while、for 或 do..while 迴圈中使用一個或多個迴圈。

迴圈控制語句

迴圈控制語句更改執行的正常順序。當執行離開作用域時,在該作用域中建立的所有自動物件都會被銷燬。

Tcl 支援以下控制語句。

序號 控制語句 & 描述
1 break 語句

終止迴圈或 switch 語句,並將執行轉移到迴圈或 switch 後面的語句。

2 continue 語句

導致迴圈跳過其主體剩餘部分,並在重複之前立即重新測試其條件。

無限迴圈

如果條件永遠不變成假,則迴圈變成無限迴圈。while 迴圈傳統上用於此目的。您可以透過將條件表示式保留為 1 來建立一個無限迴圈。

while {1} {
   puts "This loop will run forever."
}

當條件表示式不存在時,它被假定為真。Tcl 程式設計師更常使用 while {1} 結構來表示無限迴圈。

注意 - 您可以透過按 Ctrl + C 鍵來終止無限迴圈。

Tcl - 陣列

陣列是使用索引對一組元素進行系統排列。傳統陣列的語法如下所示。

set ArrayName(Index) value

建立簡單陣列的示例如下所示。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts $languages(0)
puts $languages(1)

執行上述程式碼時,會產生以下結果:

Tcl
C Language

陣列的大小

計算陣列大小的語法如下所示。

[array size variablename]

列印大小的示例如下所示。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts  [array size languages]

執行上述程式碼時,會產生以下結果:

2

陣列迭代

儘管陣列索引可以是非連續的,例如為索引 1 指定的值,然後是索引 10,依此類推。但是,如果它們是連續的,我們可以使用陣列迭代來訪問陣列的元素。下面顯示了一個用於列印陣列元素的簡單陣列迭代。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
for { set index 0 }  { $index < [array size languages] }  { incr index } {
   puts "languages($index) : $languages($index)"
}

執行上述程式碼時,會產生以下結果:

languages(0) : Tcl
languages(1) : C Language

關聯陣列

在 Tcl 中,所有陣列本質上都是關聯陣列。陣列的儲存和檢索沒有特定的順序。關聯陣列的索引不一定是數字,並且可以是稀疏填充的。下面顯示了一個帶有非數字索引的關聯陣列的簡單示例。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts  $personA(Name)
puts  $personA(Age)

執行上述程式碼時,會產生以下結果:

Dave
14

陣列的索引

檢索陣列索引的語法如下所示。

[array names variablename]

列印大小的示例如下所示。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts [array names personA]

執行上述程式碼時,會產生以下結果:

Age Name

關聯陣列的迭代

您可以使用陣列的索引遍歷關聯陣列。下面顯示了一個示例。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
foreach index [array names personA] {
   puts "personA($index): $personA($index)"
}

執行上述程式碼時,會產生以下結果:

personA(Age): 14
personA(Name): Dave

Tcl - 字串

Tcl 的基本資料型別是字串,我們經常可以在 Tcl 中發現引號作為字串語言。這些字串可以包含字母數字字元、僅數字、布林值或甚至二進位制資料。Tcl 使用 16 位 Unicode 字元,字母數字字元可以包含字母(包括非拉丁字元)、數字或標點符號。

布林值可以表示為 1、yes 或 true 表示真,0、no 或 false 表示假。

字串表示

與其他語言不同,在 Tcl 中,如果只有一個單詞,則無需包含雙引號。例如:

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

執行上述程式碼時,會產生以下結果:

hello

當我們想要表示多個字串時,可以使用雙引號或花括號。如下所示:

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

執行上述程式碼時,會產生以下結果:

hello world
hello world

字串轉義序列

字元字面量可以是普通字元(例如,'x')、轉義序列(例如,'\t')或通用字元(例如,'\u02C0')。

Tcl 中某些字元在前面加上反斜槓時具有特殊含義,它們用於表示換行符(\n)或製表符(\t)。這裡,您有一個此類轉義序列程式碼的列表:

轉義序列 含義
\\ \ 字元
\' ' 字元
\" " 字元
\? ? 字元
\a 警報或鈴聲
\b 退格鍵
\f 換頁符
\n 換行符
\r 回車符
\t 水平製表符
\v 垂直製表符

以下是顯示一些轉義序列字元的示例:

#!/usr/bin/tclsh

puts "Hello\tWorld\n\nTutorialspoint";

當上述程式碼被編譯並執行時,它會產生以下結果:

Hello   World

Tutorialspoint

String 命令

String 命令的子命令列表在以下表格中列出:

序號 方法 & 描述
1

compare string1 string2

按字典順序比較 string1 和 string2。如果相等則返回 0,如果 string1 在 string2 之前則返回 -1,否則返回 1。

2

first string1 string2

返回 string1 在 string2 中第一次出現的索引。如果未找到,則返回 -1。

3

index string index

返回索引處的字元。

4

last string1 string2

返回 string1 在 string2 中最後一次出現的索引。如果未找到,則返回 -1。

5

length string

返回字串的長度。

6

match pattern string

如果字串與模式匹配,則返回 1。

7

range string index1 index2

返回字串中從 index1 到 index2 的字元範圍。

8

tolower string

返回小寫字串。

9

toupper string

返回大寫字串。

10

trim string ?trimcharacters?

刪除字串兩端的 trimcharacters。預設的 trimcharacters 是空格。

11

trimleft string ?trimcharacters?

刪除字串開頭左側的 trimcharacters。預設的 trimcharacters 是空格。

12

trimright string ?trimcharacters?

刪除字串末尾右側的 trimcharacters。預設的 trimcharacters 是空格。

13

wordend findstring index

返回 findstring 中包含索引處字元的單詞之後字元的索引。

14

wordstart findstring index

返回 findstring 中包含索引處字元的單詞的第一個字元的索引。

下面給出了一些常用 Tcl 字串子命令的示例。

字串比較

#!/usr/bin/tclsh

set s1 "Hello"
set s2 "World"
set s3 "World"
puts [string compare $s1 $s2]
if {[string compare $s2 $s3] == 0} {
   puts "String \'s1\' and \'s2\' are same.";
}

if {[string compare $s1 $s2] == -1} {
   puts "String \'s1\' comes before \'s2\'.";
}

if {[string compare $s2 $s1] == 1} {
   puts "String \'s2\' comes after \'s1\'.";
}

當上述程式碼被編譯並執行時,它會產生以下結果:

-1
String 's1' and 's2' are same.
String 's1' comes before 's2'.
String 's2' comes after 's1'.

字串的索引

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "o"
puts "First occurrence of $s2 in s1"
puts [string first $s2 $s1]
puts "Character at index 0 in s1"
puts [string index $s1 0]
puts "Last occurrence of $s2 in s1"
puts [string last $s2 $s1]
puts "Word end index in s1"
puts [string wordend $s1 20]
puts "Word start index in s1"
puts [string wordstart $s1 20]

當上述程式碼被編譯並執行時,它會產生以下結果:

First occurrence of o in s1
4
Character at index 0 in s1
H
Last occurrence of o in s1
7
Word end index in s1
11
Word start index in s1
6

字串的長度

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Length of string s1"
puts [string length $s1]

當上述程式碼被編譯並執行時,它會產生以下結果:

Length of string s1
11

處理大小寫

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Uppercase string of s1"
puts [string toupper $s1]
puts "Lowercase string of s1"
puts [string tolower $s1]

當上述程式碼被編譯並執行時,它會產生以下結果:

Uppercase string of s1
HELLO WORLD
Lowercase string of s1
hello world

修剪字元

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "World"
puts "Trim right $s2 in $s1"
puts [string trimright $s1 $s2]

set s2 "Hello"
puts "Trim left $s2 in $s1"
puts [string trimleft $s1 $s2]

set s1 " Hello World "
set s2 " "
puts "Trim characters s1 on both sides of s2"
puts [string trim $s1 $s2]

當上述程式碼被編譯並執行時,它會產生以下結果:

Trim right World in Hello World
Hello 
Trim left Hello in Hello World
 World
Trim characters s1 on both sides of s2
Hello World

匹配字串

#!/usr/bin/tclsh

set s1 "test@test.com" 
set s2 "*@*.com"
puts "Matching pattern s2 in s1"
puts [string match "*@*.com" $s1 ]
puts "Matching pattern tcl in s1"
puts [string match {tcl} $s1]

當上述程式碼被編譯並執行時,它會產生以下結果:

Matching pattern s2 in s1
1
Matching pattern tcl in s1
0

Append 命令

#!/usr/bin/tclsh

set s1 "Hello" 
append s1 " World"
puts $s1

當上述程式碼被編譯並執行時,它會產生以下結果:

Hello World

Format 命令

下表顯示了 Tcl 中可用的格式說明符列表:

說明符 用途
%s 字串表示形式
%d 整數表示形式
%f 浮點數表示形式
%e 帶尾數-指數形式的浮點數表示形式
%x 十六進位制表示形式

下面給出了一些簡單的示例:

#!/usr/bin/tclsh

puts [format "%f" 43.5]
puts [format "%e" 43.5]
puts [format "%d %s" 4 tuts]
puts [format "%s" "Tcl Language"]
puts [format "%x" 40]

當上述程式碼被編譯並執行時,它會產生以下結果:

43.500000
4.350000e+01
4 tuts
Tcl Language
28

Scan 命令

Scan 命令用於根據格式說明符解析字串。下面給出了一些示例。

#!/usr/bin/tclsh

puts [scan "90" {%[0-9]} m]
puts [scan "abc" {%[a-z]} m]
puts [scan "abc" {%[A-Z]} m]
puts [scan "ABC" {%[A-Z]} m]

當上述程式碼被編譯並執行時,它會產生以下結果:

1
1
0
1

Tcl - 列表

列表是 Tcl 中可用的基本資料型別之一。它用於表示專案的排序集合。它可以在同一列表中包含不同型別的專案。此外,列表可以包含另一個列表。

需要注意的一件重要事情是,這些列表完全以字串形式表示,並在需要時處理以形成各個專案。因此,避免使用大型列表,在這種情況下;使用陣列。

建立列表

列表的一般語法如下所示:

set listName { item1 item2 item3 .. itemn }
# or
set listName [list item1 item2 item3]
# or 
set listName [split "items separated by a character" split_character]

下面給出了一些示例:

#!/usr/bin/tclsh

set colorList1 {red green blue}
set colorList2 [list red green blue]
set colorList3 [split "red_green_blue" _]
puts $colorList1
puts $colorList2
puts $colorList3

執行上述程式碼時,會產生以下結果:

red green blue
red green blue
red green blue

將專案追加到列表中

將專案追加到列表中的語法如下所示:

append listName split_character value
# or
lappend listName value

下面給出了一些示例:

#!/usr/bin/tclsh

set var orange
append var " " "blue"
lappend var "red" 
lappend var "green" 
puts $var

執行上述程式碼時,會產生以下結果:

orange blue red green

列表的長度

列表長度的語法如下所示:

llength listName

列表長度的示例如下所示:

#!/usr/bin/tclsh

set var {orange blue red green}
puts [llength $var] 

執行上述程式碼時,會產生以下結果:

4

索引處的列表項

選擇特定索引處的列表項的語法如下所示:

lindex listname index

索引處列表項的示例如下所示:

#!/usr/bin/tclsh

set var {orange blue red green}
puts [lindex $var  1]

執行上述程式碼時,會產生以下結果:

blue

在索引處插入專案

在特定索引處插入列表項的語法如下所示。

linsert listname index value1 value2..valuen

在特定索引處插入列表項的示例如下所示。

#!/usr/bin/tclsh

set var {orange blue red green}
set var [linsert  $var 3 black white]
puts $var

執行上述程式碼時,會產生以下結果:

orange blue red black white green

替換索引處的專案

替換特定索引處的列表項的語法如下所示:

lreplace listname firstindex lastindex value1 value2..valuen

替換特定索引處的列表項的示例如下所示。

#!/usr/bin/tclsh

set var {orange blue red green}
set var [lreplace $var 2 3 black white]
puts $var

執行上述程式碼時,會產生以下結果:

orange blue black white

設定索引處的專案

下面給出設定指定索引處列表項的語法:

lset listname index value 

下面給出設定指定索引處列表項的示例:

#!/usr/bin/tclsh

set var {orange blue red green}
lset var 0 black 
puts $var

執行上述程式碼時,會產生以下結果:

black blue red green

將列表轉換為變數

下面給出將值複製到變數的語法:

lassign listname variable1 variable2.. variablen

下面給出將列表轉換為變數的示例:

#!/usr/bin/tclsh

set var {orange blue red green}
lassign $var colour1 colour2
puts $colour1
puts $colour2

執行上述程式碼時,會產生以下結果:

orange
blue

排序列表

下面給出排序列表的語法:

lsort listname

下面給出排序列表的示例:

#!/usr/bin/tclsh

set var {orange blue red green}
set var [lsort $var]
puts $var

執行上述程式碼時,會產生以下結果:

blue green orange red

Tcl - 字典

字典是用於將值對映到鍵的結構。下面顯示了常規字典的語法:

dict set dictname key value
# or 
dict create dictname key1 value1 key2 value2 .. keyn valuen

下面顯示了一些建立字典的示例:

#!/usr/bin/tclsh

dict set colours  colour1 red 
puts $colours
dict set colours  colour2 green
puts $colours

set colours [dict create colour1 "black" colour2 "white"]
puts $colours

執行上述程式碼時,會產生以下結果:

colour1 red
colour1 red colour2 green
colour1 black colour2 white

字典的大小

下面給出獲取字典大小的語法:

[dict size dictname]

下面給出列印大小的示例:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
puts [dict size $colours]

執行上述程式碼時,會產生以下結果:

2

字典迭代

下面顯示了一個簡單的字典迭代,用於列印字典的鍵和值:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
foreach item [dict keys $colours] {
   set value [dict get $colours $item]
   puts $value
}

執行上述程式碼時,會產生以下結果:

black
white

字典中鍵的值

下面給出在字典中檢索鍵的值的語法:

[dict get $dictname $keyname]

下面給出檢索鍵值的示例:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set value [dict get $colours colour1]
puts $value

執行上述程式碼時,會產生以下結果:

black

字典中的所有鍵

下面給出檢索字典中所有鍵的語法:

[dict keys $dictname]

下面給出列印所有鍵的示例:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set keys [dict keys $colours]
puts $keys

執行上述程式碼時,會產生以下結果:

colour1 colour2

字典中的所有值

下面給出檢索字典中所有值的語法:

[dict values $dictname]

下面給出列印所有值的示例:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set values [dict values $colours]
puts $values

執行上述程式碼時,會產生以下結果:

black white

鍵是否存在於字典中

下面給出檢查鍵是否存在於字典中的語法:

[dict exists $dictname $key]

下面給出檢查鍵是否存在於字典中的示例:

#!/usr/bin/tclsh

set colours [dict create colour1 "black" colour2 "white"]
set result [dict exists $colours colour1]
puts $result

執行上述程式碼時,會產生以下結果:

1

Tcl - 過程

過程只不過是一系列命令的程式碼塊,提供特定的可重用功能。它用於避免在多個位置重複相同的程式碼。過程等效於許多程式語言中使用的函式,並且在 Tcl 中藉助 **proc** 命令提供。

下面顯示了建立簡單過程的語法:

proc procedureName {arguments} {
   body
}

下面給出了過程的一個簡單示例:

#!/usr/bin/tclsh

proc helloWorld {} {
   puts "Hello, World!"
}
helloWorld

執行上述程式碼時,會產生以下結果:

Hello, World!

帶多個引數的過程

下面顯示了帶引數過程的示例:

#!/usr/bin/tclsh

proc add {a b} {
   return [expr $a+$b]
}
puts [add 10 30]

執行上述程式碼時,會產生以下結果:

40

帶可變引數的過程

下面顯示了帶引數過程的示例:

#!/usr/bin/tclsh

proc avg {numbers} {
   set sum 0
   foreach number $numbers {
      set sum  [expr $sum + $number]
   }
   set average [expr $sum/[llength $numbers]]
   return $average
}
puts [avg {70 80 50 60}]
puts [avg {70 80 50 }]

執行上述程式碼時,會產生以下結果:

65
66

帶預設引數的過程

預設引數用於提供預設值,如果未提供值,則可以使用這些預設值。下面顯示了一個帶預設引數的過程示例,有時也稱為隱式引數:

#!/usr/bin/tclsh

proc add {a {b 100} } {
   return [expr $a+$b]
}
puts [add 10 30]
puts [add 10]

執行上述程式碼時,會產生以下結果:

40
110

遞迴過程

下面給出了遞迴過程的示例:

#!/usr/bin/tclsh

proc factorial {number} {
   if {$number <= 1} {
      return 1
   } 
   return [expr $number * [factorial [expr $number - 1]]]

}
puts [factorial 3]
puts [factorial 5]

執行上述程式碼時,會產生以下結果:

6
120

Tcl - 包

包用於建立可重用的程式碼單元。一個包包含一系列提供特定功能的檔案。此檔案集合由包名稱標識,並且可以具有相同檔案的多個版本。該包可以是 Tcl 指令碼、二進位制庫或兩者的組合。

包使用名稱空間的概念來避免變數名和過程名的衝突。在我們的下一個“名稱空間”教程中檢視更多資訊。

建立包

可以使用至少兩個檔案建立包。一個檔案包含包程式碼。另一個檔案包含用於宣告包的索引包檔案。

下面給出建立和使用包的步驟列表。

步驟 1:建立程式碼

在資料夾(例如 HelloWorld)中建立包的程式碼。讓檔名為 HelloWorld.tcl,程式碼如下所示:

# /Users/rajkumar/Desktop/helloworld/HelloWorld.tcl 
# Create the namespace
namespace eval ::HelloWorld {
 
  # Export MyProcedure
  namespace export MyProcedure
 
  # My Variables
   set version 1.0
   set MyDescription "HelloWorld"
 
  # Variable for the path of the script
   variable home [file join [pwd] [file dirname [info script]]]
 
}
 
# Definition of the procedure MyProcedure
proc ::HelloWorld::MyProcedure {} {
   puts $HelloWorld::MyDescription
}

package provide HelloWorld $HelloWorld::version
package require Tcl 8.0

步驟 2:建立包索引

開啟 tclsh。切換到 HelloWorld 目錄,並使用 pkg_mkIndex 命令建立索引檔案,如下所示:

% cd /Users/rajkumar/Desktop/helloworld 
% pkg_mkIndex . *.tcl

步驟 3:將目錄新增到 autopath

使用 lappend 命令將包新增到全域性列表中,如下所示:

% lappend auto_path "/Users/rajkumar/Desktop/helloworld"

步驟 4:新增包

接下來,使用 package require 語句將包新增到程式中,如下所示:

% package require HelloWorld 1.0

步驟 5:呼叫過程

現在,一切設定就緒,我們可以呼叫我們的過程,如下所示:

% puts [HelloWorld::MyProcedure]

您將獲得以下結果:

HelloWorld

前兩個步驟建立了包。建立包後,您可以透過新增最後三個語句(如下所示)在任何 Tcl 檔案中使用它:

lappend auto_path "/Users/rajkumar/Desktop/helloworld"
package require HelloWorld 1.0
puts [HelloWorld::MyProcedure]

您將獲得以下結果:

HelloWorld

Tcl - 名稱空間

名稱空間是識別符號集的容器,用於對變數和過程進行分組。名稱空間從 Tcl 版本 8.0 開始可用。在引入名稱空間之前,只有一個全域性作用域。現在有了名稱空間,我們有了全域性作用域的其他分割槽。

建立名稱空間

名稱空間是使用 **namespace** 命令建立的。下面顯示了一個建立名稱空間的簡單示例:

#!/usr/bin/tclsh

namespace eval MyMath {
  # Create a variable inside the namespace
  variable myResult
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
  set ::MyMath::myResult [expr $a + $b]
}
MyMath::Add 10 23

puts $::MyMath::myResult

執行上述程式碼時,會產生以下結果:

33

在上面的程式中,您可以看到有一個名稱空間,其中包含一個變數 **myResult** 和一個過程 **Add**。這使得可以在不同的名稱空間下建立同名的變數和過程成為可能。

巢狀名稱空間

Tcl 允許巢狀名稱空間。下面給出了巢狀名稱空間的一個簡單示例:

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
}

namespace eval extendedMath {
   # Create a variable inside the namespace
   namespace eval MyMath {
      # Create a variable inside the namespace
      variable myResult
   }
}
set ::MyMath::myResult "test1"
puts $::MyMath::myResult
set ::extendedMath::MyMath::myResult "test2"
puts $::extendedMath::MyMath::myResult

執行上述程式碼時,會產生以下結果:

test1
test2

匯入和匯出名稱空間

您可以在前面的名稱空間示例中看到,我們使用了大量的範圍解析運算子,使用起來比較複雜。我們可以透過匯入和匯出名稱空間來避免這種情況。下面給出了一個示例:

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}

namespace import MyMath::*
puts [Add 10 30]

執行上述程式碼時,會產生以下結果:

40

忘記名稱空間

您可以使用 **forget** 子命令刪除匯入的名稱空間。下面給出了一個簡單的示例:

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}
namespace import MyMath::*
puts [Add 10 30]
namespace forget MyMath::*

執行上述程式碼時,會產生以下結果:

40

Tcl - 檔案 I/O

Tcl 在內建命令 open、read、puts、gets 和 close 的幫助下支援檔案處理。

檔案表示一系列位元組,無論它是文字檔案還是二進位制檔案。

開啟檔案

Tcl 使用 open 命令在 Tcl 中開啟檔案。開啟檔案的語法如下:

open fileName accessMode

這裡,**filename** 是字串文字,您將使用它來命名您的檔案,而 **accessMode** 可以具有以下值之一:

序號 模式和描述
1

r

以讀取目的開啟現有的文字檔案,並且檔案必須存在。這是未指定 accessMode 時使用的預設模式。

2

w

開啟文字檔案以寫入,如果它不存在,則建立一個新檔案,否則截斷現有檔案。

3

a

以追加模式開啟文字檔案以寫入,並且檔案必須存在。在這裡,您的程式將開始將內容追加到現有檔案內容中。

4

r+

開啟文字檔案以進行讀取和寫入。檔案必須已經存在。

5

w+

開啟文字檔案以進行讀取和寫入。如果檔案存在,則首先將其截斷為零長度,否則如果檔案不存在,則建立檔案。

6

a+

開啟文字檔案以進行讀取和寫入。如果檔案不存在,則建立檔案。讀取將從開頭開始,但只能追加寫入。

關閉檔案

要關閉檔案,請使用 close 命令。close 的語法如下:

close fileName 

程式開啟的任何檔案都必須在程式完成使用該檔案時關閉。在大多數情況下,無需顯式關閉檔案;當檔案物件自動終止時,它們會自動關閉。

寫入檔案

Puts 命令用於寫入開啟的檔案。

puts $filename "text to write"

下面顯示了一個寫入檔案的簡單示例。

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "test"
close $fp

當編譯並執行上述程式碼時,它會在其啟動的目錄(在程式的工作目錄中)中建立一個名為 **input.txt** 的新檔案。

讀取檔案

以下是從檔案讀取的簡單命令:

set file_data [read $fp]

下面顯示了一個完整的讀寫示例:

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "test"
close $fp
set fp [open "input.txt" r]
set file_data [read $fp]
puts $file_data
close $fp

當編譯並執行上述程式碼時,它會讀取上一節中建立的檔案併產生以下結果:

test

以下是另一個逐行讀取檔案直至檔案結尾的示例:

#!/usr/bin/tclsh

set fp [open "input.txt" w+]
puts $fp "test\ntest"
close $fp
set fp [open "input.txt" r]

while { [gets $fp data] >= 0 } {
   puts $data
}
close $fp

當編譯並執行上述程式碼時,它會讀取上一節中建立的檔案併產生以下結果:

test
test

Tcl - 錯誤處理

Tcl 中的錯誤處理在 **error** 和 **catch** 命令的幫助下提供。下面顯示了每個命令的語法。

錯誤語法

error message info code

在上面的錯誤命令語法中,message 是錯誤訊息,info 設定在全域性變數 errorInfo 中,code 設定在全域性變數 errorCode 中。

Catch 語法

catch script resultVarName

在上面的 catch 命令語法中,script 是要執行的程式碼,resultVarName 是儲存錯誤或結果的變數。如果沒有任何錯誤,則 catch 命令返回 0,如果有錯誤,則返回 1。

下面給出了一個簡單的錯誤處理示例:

#!/usr/bin/tclsh

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

if {[catch {puts "Result = [Div 10 2]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

執行上述程式碼時,會產生以下結果:

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
   (procedure "Div" line 1)
   invoked from within
"Div 10 0"

Result = 5

如您在上面的示例中看到的,我們可以建立自己的自定義錯誤訊息。類似地,可以捕獲 Tcl 生成的錯誤。下面給出了一個示例:

#!/usr/bin/tclsh

catch {set file [open myNonexistingfile.txt]} result
puts "ErrorMsg: $result"
puts "ErrorCode: $errorCode"
puts "ErrorInfo:\n$errorInfo\n"

執行上述程式碼時,會產生以下結果:

ErrorMsg: couldn't open "myNonexistingfile.txt": no such file or directory
ErrorCode: POSIX ENOENT {no such file or directory}
ErrorInfo:
couldn't open "myNonexistingfile.txt": no such file or directory
   while executing
"open myNonexistingfile.txt"

Tcl - 內建函式

Tcl 提供了許多用於各種操作的內建函式(過程)。這包括:

  • 用於 列表 處理的函式。

  • 用於 字串 處理的函式。

  • 用於 陣列 處理的函式。

  • 用於 字典 處理的函式。

  • 用於 檔案 I/O 處理的函式。

  • 用於建立 名稱空間包。 的函式。

  • 用於數學運算的函式。

  • 用於系統操作的函式。

除了數學和系統函式之外,上述每個函式都在前面的章節中進行了介紹。數學和系統內建函式將在下面解釋。

數學函式

Tcl 中可用的數學函式列在下表中:

序號 方法和描述
1

abs arg

計算 arg 的絕對值。

2

acos arg

計算 arg 的反餘弦。

3

asin arg

計算 arg 的反正弦。

4

atan arg

計算 arg 的反正切。

5

atan2 y x

計算其引數 (y/x) 的商的反正切。

6

ceil arg

計算大於或等於數字的最小整數。

7

cos arg

計算 arg 的餘弦。

8

cosh arg

計算 arg 的雙曲餘弦。

9

double arg

計算 arg 是否為浮點值,返回 arg,否則將 arg 轉換為浮點並返回轉換後的值。

10

exp arg

計算指數函式(e 的 arg 次冪)。

11

floor arg

計算小於或等於 arg 的最大整數。

12

fmod x y

計算 x 除以 y 的浮點餘數。如果 y 為 0,則返回錯誤。

13

hypot x y

計算直角三角形斜邊的長度 sqrt(x*x+y*y)。

14

int arg

計算 arg 是否為與機器字寬度相同的整數值,返回 arg,否則將 arg 轉換為整數。

15

log arg

計算 arg 的自然對數。

16

log10 arg

計算 arg 的以 10 為底的對數。

17

pow x y

計算 x 的 y 次冪的值。如果 x 為負數,則 y 必須為整數值。

18

rand

計算 0 到 1 之間的偽隨機數。

19

round arg

計算 arg 四捨五入到最接近整數的值。

20

sin arg

計算 arg 的正弦。

21

sinh arg

計算 arg 的雙曲正弦。

22

sqrt arg

計算 arg 的平方根。arg 必須為正數。

23

srand arg

計算 0 到 1 之間的偽隨機數。arg(必須為整數)用於重置 rand 的隨機數生成器的種子。

24

tan arg

計算 arg 的正切。

25

tanh arg

計算 arg 的雙曲正切。

26

wide arg

如果引數不是 64 位整數,則計算至少 64 位寬的整數(如果引數是 32 位數字,則透過符號擴充套件)。

下面給出了一些使用數學函式的示例:

#!/usr/bin/tclsh

namespace import ::tcl::mathfunc::*
puts [tan 10]
puts [pow 10 2]
puts [ceil 10.34]
puts [hypot 10 20]
puts [srand 45]
puts [log 10]
puts [srand 45]

執行上述程式碼時,會產生以下結果:

0.6483608274590866
100.0
11.0
22.360679774997898
0.0003521866166741525
2.302585092994046
0.0003521866166741525

系統函式

Tcl 中重要的系統函式包括:

  • clock - 秒函式,返回以秒為單位的當前時間。

  • clock - 格式函式,將秒格式化為日期和時間。

  • clock - 掃描函式,掃描輸入字串並將其轉換為秒。

  • open - 函式,用於開啟檔案。

  • exec - 函式,用於執行系統命令。

  • close - 函式,用於關閉檔案。

上面這些函式的一些示例如下所示:

#!/usr/bin/tclsh

#get seconds
set currentTime [clock seconds]
puts $currentTime
#get format 
puts "The time is: [clock format $currentTime -format %H:%M:%S]"
puts "The date is: [clock format $currentTime -format %D]"

set date "Jun 15, 2014"
puts [clock scan $date -format {%b %d, %Y}]

puts [exec ls]
puts [exec dir]

set a  [open input.txt]
puts [read $a];
puts $a
close $a

執行上述程式碼時,會產生以下結果:

1402819756
The time is: 03:09:16
The date is: 06/15/2014
1402808400
input.txt
main.tcl
input.txt  main.tcl
This is the file you can use to provide input to your program and later on open
   it inside your program to process the input.

file3

下表提供了可用於格式化日期和時間的字串列表。

序號 格式和描述
1

%a

簡寫形式的日期,例如:Sun。

2

%A

完整形式的日期,例如:Sunday。

3

%b

簡寫形式的月份。

4

%B

完整形式的月份。

5

%d

月份中的日期。

6

%j

一年中的儒略日。

7

%m

月份的數字表示。

8

%y

兩位數的年份。

9

%Y

四位數的年份。

10

%H

24 小時制的小時。

11

%I

12 小時制的小時。

12

%M

分鐘。

13

%S

秒。

14

%p

AM 或 PM。

15

%D

數字表示的日期,mm/dd/yy。

16

%r

12 小時制的時間。

17

%R

24 小時制的時間,不含秒。

18

%T

24 小時制的時間,含秒。

19

%Z

時區名稱,例如 GMT、IST、EST 等。

Tcl - 正則表示式

"regexp" 命令用於匹配 Tcl 中的正則表示式。正則表示式是一系列包含搜尋模式的字元。它包含多個規則,下表解釋了這些規則及其對應的用法。

序號 規則和描述
1

x

精確匹配。

2

[a-z]

a 到 z 之間的任何小寫字母。

3

.

任何字元。

4

^

字串開頭應該匹配。

5

$

字串結尾應該匹配。

6

\^

反斜槓序列,用於匹配特殊字元 ^。類似地,您可以將其用於其他字元。

7

()

將上述序列新增到括號內以構成正則表示式。

8

x*

應該匹配前面 x 的 0 次或多次出現。

9

x+

應該匹配前面 x 的 1 次或多次出現。

10

[a-z]?

應該匹配前面 x 的 0 次或 1 次出現。

11

{digit}

匹配前面正則表示式出現的 digit 次。digit 包含 0-9。

12

{digit,}

匹配前面正則表示式出現的 3 次或更多 digit 次。digit 包含 0-9。

13

{digit1,digit2}

匹配前面正則表示式出現的 digit1 到 digit2 次之間的次數。

語法

正則表示式的語法如下所示:

regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn

這裡,regex 是命令。我們稍後將瞭解可選開關。Patterns 是前面提到的規則。Search string 是執行正則表示式的實際字串。Full match 是任何用於儲存匹配的正則表示式結果的變數。Submatch1 到 SubMatchn 是可選的子匹配變數,用於儲存子匹配模式的結果。

在深入研究複雜的示例之前,讓我們先看一些簡單的示例。一個簡單的字串示例,其中包含任何字母。當遇到任何其他字元時,正則表示式搜尋將停止並返回。

#!/usr/bin/tclsh

regexp {([A-Za-z]*)} "Tcl Tutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"

執行上述程式碼時,會產生以下結果:

Full Match: Tcl
Sub Match1: Tcl

多個模式

以下示例演示瞭如何搜尋多個模式。這是一個示例模式,用於匹配任何字母后跟任何字元再後跟任何字母。

#!/usr/bin/tclsh

regexp {([A-Za-z]*).([A-Za-z]*)} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

執行上述程式碼時,會產生以下結果:

Full Match: Tcl Tutorial
Sub Match1: Tcl
Sub Match2: Tutorial

下面顯示了上面程式碼的修改版本,用於說明子模式可以包含多個模式:

#!/usr/bin/tclsh

regexp {([A-Za-z]*.([A-Za-z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

執行上述程式碼時,會產生以下結果:

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

Regex 命令的開關

Tcl 中可用的開關列表如下:

  • nocase - 用於忽略大小寫。

  • indices - 儲存匹配的子模式的位置,而不是匹配的字元。

  • line - 對換行符敏感的匹配。忽略換行符後的字元。

  • start index - 設定搜尋模式開始的偏移量。

  • 標記開關的結束

在上面的示例中,我故意對所有字母都使用了 [A-Z, a-z],您可以輕鬆地使用 -nocase 代替,如下所示:

#!/usr/bin/tclsh

regexp -nocase {([A-Z]*.([A-Z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

執行上述程式碼時,會產生以下結果:

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

另一個使用開關的示例如下所示:

#!/usr/bin/tclsh

regexp -nocase -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"
regexp -nocase -start 4 -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b  
puts "Full Match: $a"
puts "Sub Match1: $b"

執行上述程式碼時,會產生以下結果:

Full Match: Tcl 
Sub Match1: Tcl 
Full Match: Tutorial
Sub Match1: Tutorial

Tk - 概述

Tk 代表工具包,它提供跨平臺的 GUI 元件,幫助您構建圖形使用者介面。它是由 John Ousterhout 開發的,作為 Tcl 指令碼語言的擴充套件。在與 Tcl 同步到 v8.0 之前,Tk 與 Tcl 的開發是獨立進行的,版本彼此不同。

Tk 的特點

它是一個跨平臺的工具包,支援 Linux、Mac OS、Unix 和 Microsoft Windows 作業系統。

  • 它是開源的。
  • 它提供了高度的可擴充套件性。
  • 它是可定製的。
  • 它是可配置的。
  • 它提供了大量的元件。
  • 它可以與其他動態語言一起使用,而不僅僅是 Tcl。
  • GUI 在各個平臺上看起來相同。

使用 Tk 構建的應用程式

許多成功的應用程式都是使用 Tcl/Tk 構建的。

  • 儀表板軟體使用者介面
  • 關係資料庫的表單 GUI
  • 關係資料庫的 Ad Hoc GUI
  • 軟體/硬體系統設計
  • Xtask - 任務管理
  • 使用 Tcl 和 Tk 進行音樂學研究
  • 日曆應用程式
  • Tk 郵件
  • Tk 偵錯程式

Tk - 環境

通常,所有 Mac 和 Linux 系統都預裝了 Tk。如果它不可用或您需要最新版本,則可能需要安裝它。Windows 沒有自帶 Tcl/Tk,您可能需要使用其特定的二進位制檔案來安裝它。

Tk 直譯器

它只是一個小的程式,允許您鍵入 Tk 命令並逐行執行它們。與編譯器(編譯器會完全執行)不同,它會在遇到錯誤時停止執行 tcl 檔案。

讓我們建立一個名為 helloWorld.tcl 的檔案,如下所示。我們將使用它作為第一個程式,在您選擇的平臺上執行。

#!/usr/bin/wish

grid [ttk::button .mybutton -text "Hello World"] 

以下部分僅解釋如何在每個可用的平臺上安裝 Tcl/Tk。

在 Windows 上安裝

從提供的 Active Tcl/Tk 二進位制檔案列表中下載適用於 Windows 的最新版本安裝程式。Active Tcl/Tk 社群版可供個人免費使用。

執行下載的可執行檔案以安裝 Tcl 和 Tk,這可以透過按照螢幕上的說明進行操作。

現在,我們可以透過使用 cd 切換到包含檔案的資料夾,然後使用以下步驟構建並執行 Tcl 檔案(例如 helloWorld.tcl):

C:\Tcl> wish helloWorld.tcl

按 Enter 鍵,我們將看到如下所示的輸出:

Hello World Windows

在 Linux 上安裝

大多數 Linux 作業系統都內建了 Tk,您可以在這些系統上立即開始使用。如果它不可用,您可以使用以下命令下載並安裝 Tcl-Tk。

$ yum install tcl tk

現在,我們可以透過使用cd 命令切換到包含檔案的資料夾,然後使用以下步驟構建並執行 Tcl 檔案(例如 helloWorld.tcl):

$ wish helloWorld.tcl

按 Enter 鍵,我們將看到類似於以下內容的輸出:

Hello World

在基於 Debian 的系統上安裝

如果它在您的作業系統中沒有預構建版本,您可以使用以下命令下載並安裝 Tcl-Tk:

$ sudo apt-get install tcl tk

現在,我們可以透過使用cd 命令切換到包含檔案的資料夾,然後使用以下步驟構建並執行 Tcl 檔案(例如 helloWorld.tcl):

$ wish helloWorld.tcl

按 Enter 鍵,我們將看到類似於以下內容的輸出:

Hello World

在 Mac OS X 上安裝

從提供的 Active Tcl/Tk 二進位制檔案列表中下載適用於 Mac OS X 的最新版本軟體包。Active Tcl 社群版可供個人免費使用。

執行下載的可執行檔案以安裝 Active Tcl,這可以透過按照螢幕上的說明進行。

現在,我們可以透過使用cd 命令切換到包含檔案的資料夾,然後使用以下步驟構建並執行 Tcl 檔案(例如 helloWorld.tcl):

$ wish helloWorld.tcl

按 Enter 鍵,我們將看到如下所示的輸出:

Hello World

從原始檔安裝

當沒有可用的二進位制軟體包時,您可以選擇從原始檔安裝。通常建議對 Windows 和 Mac OS X 使用 Tk 二進位制檔案,因此下面僅顯示在基於 Unix 的系統上編譯原始碼的過程:

  • 下載 原始檔。

  • 現在,切換到下載的資料夾後,使用以下命令進行解壓縮、編譯和構建。

$ tar zxf tk8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure —with-tcl=../../tcl8.6.1/unix —prefix=/opt —enable-gcc
$ make
$ sudo make install

注意 - 確保將檔名更改為在上面命令 1 和 2 中下載的版本。

Tk - 特殊變數

在 Tk 中,我們將某些變數分類為特殊變數,它們具有預定義的用法/功能。下面列出了特殊變數的列表。

序號 特殊變數 & 描述
1

tk_library

用於設定標準 Tk 庫的位置。

2

tk_patchLevel

指的是 Tk 直譯器的當前補丁級別。

3

tk_strictMotif

當非零時,Tk 會盡可能地遵循 Motif 的外觀和風格。

4

tk_version

顯示 Tk 版本。

上述特殊變數對 Tk 直譯器具有特殊的含義。

使用 Tk 特殊變數的示例

讓我們看看特殊變數的示例。

TK 版本

#!/usr/bin/wish

puts $tk_version

執行程式時,您將獲得類似於以下內容的輸出。

8.5

TK 庫路徑

#!/usr/bin/wish

puts $tk_library

執行程式時,您將獲得類似於以下內容的輸出。

/Library/Frameworks/Tk.framework/Versions/8.6/Resources/Scripts

TK 補丁級別

#!/usr/bin/wish

puts $tk_patchLevel

執行程式時,您將獲得類似於以下內容的輸出。

8.6.1

TK STRICTMOTIF

#!/usr/bin/wish

puts $tk_strictMotif

執行程式時,您將獲得類似於以下內容的輸出。

0

Tk - 小部件概述

基於 Tk 的應用程式的基本元件稱為元件。元件有時也稱為視窗,因為在 Tk 中,“視窗”和“元件”通常可以互換使用。Tk 是一個提供豐富的圖形元件的包,用於使用 Tcl 建立圖形應用程式。

Tk 提供了一系列元件,從基本的 GUI 元件(如按鈕和選單)到資料顯示元件。這些元件非常易於配置,因為它們具有預設配置,使用起來非常方便。

Tk 應用程式遵循元件層次結構,其中任意數量的元件可以放置在另一個元件中,而這些元件又可以放置在另一個元件中。Tk 程式中的主元件稱為根元件,可以透過建立 TkRoot 類的新例項來建立。

建立元件

建立元件的語法如下所示。

type variableName arguments options

這裡的 type 指的是元件型別,例如按鈕、標籤等。根據每個元件的語法,引數可以是可選的或必需的。選項範圍從每個元件的大小到格式。

元件命名約定

元件使用類似於命名包的結構。在 Tk 中,根視窗的名稱為句點(.)和視窗中的元素,例如按鈕命名為 .myButton1。變數名應以小寫字母、數字或標點符號(句點除外)開頭。第一個字元之後,其他字元可以是大寫或小寫字母、數字或標點符號(句點除外)。建議使用小寫字母作為標籤的開頭。

顏色命名約定

可以使用名稱(如紅色、綠色等)宣告顏色。它還可以使用十六進位制表示,以 # 開頭。十六進位制數字的個數可以是 3、6、9 或 12。

尺寸約定

預設單位是畫素,當我們沒有指定任何尺寸時使用。其他尺寸包括:i 表示英寸,m 表示毫米,c 表示釐米,p 表示磅。

常用選項

所有部件都提供許多常用選項,如下表所示:

序號 語法和描述
1

-background color

用於設定部件的背景顏色。

2

-borderwidth width

用於以 3D 效果繪製邊框。

3

-font fontDescriptor

用於設定部件的字型。

4

-foreground color

用於設定部件的前景色。

5

-height number

用於設定部件的高度。

6

-highlightbackground color

用於設定部件失去焦點時周圍繪製的顏色矩形。

7

-highlightcolor color

用於設定部件獲得焦點時周圍繪製的顏色矩形。

8

-padx number

設定部件的水平內邊距。

9

-pady number

設定部件的垂直內邊距。

10

-relief condition

設定部件的 3D 浮雕效果。condition 可以是 raised、sunken、flat、ridge、solid 或 groove。

11

-text text

設定部件的文字。

12

-textvariable varName

與部件關聯的變數。當部件的文字發生變化時,變數將設定為部件的文字。

13

-width number

設定部件的寬度。

下面顯示了一個選項的簡單示例。

#!/usr/bin/wish

grid [label .myLabel -background red -text "Hello World" -relief ridge -borderwidth 3]
   -padx 100 -pady 100

執行上述程式後,將得到以下輸出。

Hello World Options

可用的部件分類如下:

基本部件

序號 部件和描述
1

Label

用於顯示單行文字的部件。

2

Button

可點選的部件,用於觸發操作。

3

Entry

用於接受單行文字輸入的部件。

4

Message

用於顯示多行文字的部件。

5

Text

用於顯示和可選編輯多行文字的部件。

6

Toplevel

帶有視窗管理器提供的全部邊框和裝飾的視窗。

佈局部件

序號 部件和描述
1

Frame

容器部件,用於容納其他部件。

2

Place

用於在特定位置容納其他部件,使用其原點座標和精確尺寸。

3

Pack

簡單的部件,用於在將部件放置到父部件之前將其組織成塊。

4

Grid

用於巢狀部件,以不同方向打包。

選擇部件

序號 部件和描述
1

Radiobutton

具有一組開/關按鈕和標籤的部件,其中只能選擇一個。

2

Checkbutton

具有一組開/關按鈕和標籤的部件,可以選中多個。

3

Menu

充當選單項容器的部件。

4

Listbox

顯示單元格列表的部件,可以選中一個或多個單元格。

大型部件

序號 部件和描述
1

Dialog

用於顯示對話方塊的部件。

2

Spinbox

允許使用者選擇數字的部件。

3

Combobox

將輸入框與一組可供使用者選擇的選項相結合的部件。

4

Notebook

選項卡式部件,使用索引選項卡在多個頁面之間切換。

5

Progressbar

用於提供檔案上傳等長時間操作的進度視覺化反饋的部件。

6

Treeview

用於顯示和允許瀏覽樹狀結構的專案的部件。

7

Scrollbar

沒有文字或畫布部件的滾動部件。

8

Scale

比例尺部件,用於透過滑塊選擇數值。

其他部件

序號 部件和描述
1

Canvas

用於顯示圖形和影像的繪圖部件。

我們將在接下來的章節中介紹每個部件。

Tk - 基本小部件

基本部件是幾乎所有 Tk 應用程式中都提供的常用部件。可用的基本部件列表如下:

序號 部件和描述
1 Label

用於顯示單行文字的部件。

2 Button

可點選的部件,用於觸發操作。

3 Entry

用於接受單行文字輸入的部件。

4 Message

用於顯示多行文字的部件。

5 Text

用於顯示和可選編輯多行文字的部件。

6 Toplevel

用於建立作為新頂級視窗的框架的部件。

下面顯示了一個使用基本部件的簡單 Tk 示例:

#!/usr/bin/wish

grid [label .myLabel -text "Label Widget" -textvariable labelText] 
grid [text .myText -width 20 -height 5]
.myText insert 1.0 "Text\nWidget\n"
grid [entry .myEntry -text "Entry Widget"]
grid [message .myMessage -background red -foreground white -text "Message\nWidget"]
grid [button .myButton1  -text "Button" -command "set labelText clicked"]

執行上述程式後,將得到以下輸出:

Basic Widgets Example

Tk - 佈局小部件

佈局部件用於處理 Tk 應用程式的佈局。Frame 部件用於對其他部件進行分組,place、pack 和 grid 是佈局管理器,使您可以完全控制新增到視窗中的內容。可用的佈局部件列表如下所示:

序號 部件和描述
1 Frame

容器部件,用於容納其他部件。

2 Place

用於在特定位置容納其他部件,使用其原點座標和精確尺寸。

3 Pack

簡單的部件,用於在將部件放置到父部件之前將其組織成塊。

4 Grid

用於巢狀部件,以不同方向打包。

下面顯示了一個佈局部件的簡單 Tk 示例:

#!/usr/bin/wish

frame .myFrame1 -background red  -relief ridge -borderwidth 8 -padx 10 -pady 10
   -height 100 -width 100
frame .myFrame2 -background blue  -relief ridge -borderwidth 8 -padx 10 -pady 10
   -height 100 -width 50
pack .myFrame1 
pack .myFrame2

執行上述程式後,將得到以下輸出:

Frame Widget Example

Tk - 選擇小部件

選擇部件用於在 Tk 應用程式中選擇不同的選項。可用的選擇部件列表如下所示。

序號 部件和描述
1 Radiobutton

具有一組開/關按鈕和標籤的部件,其中只能選擇一個。

2 Checkbutton

具有一組開/關按鈕和標籤的部件,可以選中多個。

3 Menu

充當選單項容器的部件。

4 Listbox

顯示單元格列表的部件,可以選中一個或多個單元格。

下面顯示了一個使用選擇部件的簡單 Tk 示例:

#!/usr/bin/wish

grid [frame .gender ]
grid [label .label1  -text "Male" -textvariable myLabel1 ] 
grid [radiobutton .gender.maleBtn -text "Male"   -variable gender -value "Male"
   -command "set  myLabel1 Male"] -row 1 -column 2
grid [radiobutton .gender.femaleBtn -text "Female" -variable gender -value "Female"
   -command "set  myLabel1 Female"] -row 1 -column 3
.gender.maleBtn select
grid [label .myLabel2  -text "Range 1 not selected" -textvariable myLabelValue2 ] 
grid [checkbutton .chk1 -text "Range 1" -variable occupied1 -command {if {$occupied1 } {
   set myLabelValue2 {Range 1 selected}
} else {
   set myLabelValue2 {Range 1 not selected}
} }]
proc setLabel {text} {
   .label configure -text $text 
}

執行上述程式後,將得到以下輸出:

Selection Widget Example

Tk - 畫布小部件

Canvas 用於提供繪圖區域。Canvas 部件的語法如下所示:

canvas canvasName options

選項

Canvas 部件可用的選項如下表所示:

序號 語法和描述
1

-background color

用於設定部件的背景顏色。

2

-closeenough distance

設定滑鼠游標與可顯示專案的接近程度。預設值為 1.0 畫素。此值可以是分數,並且必須為正數。

3

-scrollregion boundingBox

此畫布總區域的邊界框。

4

-height number

用於設定部件的高度。

5

-width number

設定部件的寬度。

6

-xscrollincrement size

請求滾動時水平滾動的量。

7

-yscrollincrement size

請求滾動時垂直滾動的量。

下面顯示了一個 Canvas 部件的簡單示例:

#!/usr/bin/wish

canvas .myCanvas -background red -width 100 -height 100 
pack .myCanvas

執行上述程式後,將得到以下輸出:

Canvas Widget Example

用於在 Canvas 中繪圖的部件

用於在 Canvas 中繪圖的可用部件列表如下所示:

序號 部件和描述
1 Line

繪製一條線。

2 Arc

繪製一個弧形。

3 Rectangle

繪製一個矩形。

4 Oval

繪製一個橢圓。

5 Polygon

繪製一個多邊形。

6 Text

繪製文字。

7 Bitmap

繪製一個位圖。

8 Image

繪製一個影像。

下面顯示了一個使用不同 Canvas 部件的示例:

#!/usr/bin/wish

canvas .myCanvas -background red -width 200 -height 200 
pack .myCanvas
.myCanvas create arc 10 10 50 50 -fill yellow
.myCanvas create line 10 30 50 50 100 10 -arrow both -fill yellow -smooth true
   -splinesteps 2
.myCanvas create oval 50 50 100 80 -fill yellow
.myCanvas create polygon 50 150 100 80 120 120 100 190 -fill yellow -outline green
.myCanvas create rectangle 150 150 170 170  -fill yellow
.myCanvas create text 170 20 -fill yellow -text "Hello" -font {Helvetica -18 bold}
.myCanvas create bitmap 180 50 -bitmap info

執行上述程式後,將得到以下輸出:

Canvas Widget Example2

Tk - 超級小部件

大型部件包括許多複雜的部件,這些部件通常在某些大型 Tk 應用程式中需要。可用的大型部件列表如下所示:

序號 部件和描述
1 Dialog

用於顯示對話方塊的部件。

2 Spinbox

允許使用者選擇數字的部件。

3 Combobox

將輸入框與一組可供使用者選擇的選項相結合的部件。

4 Notebook

選項卡式部件,使用索引選項卡在多個頁面之間切換。

5 Progressbar

用於提供檔案上傳等長時間操作的進度視覺化反饋的部件。

6 Treeview

用於顯示和允許瀏覽樹狀結構的專案的部件。

7 Scrollbar

沒有文字或畫布部件的滾動部件。

8 Scale

比例尺部件,用於透過滑塊選擇數值。

下面顯示了一個使用一些大型部件的簡單 Tk 示例。

#!/usr/bin/wish

ttk::treeview .tree -columns "Creator Year" -displaycolumns "Year Creator" 
.tree heading Creator -text "Creator" -anchor center
.tree heading Year -text "Year" -anchor center
pack .tree
.tree insert {} end -id Languages -text "Languages"
.tree insert Languages end -text C -values [list "Dennis Ritchie" "1990"]
proc scaleMe {mywidget scaleValue} {
	$mywidget configure -length $scaleValue
} 
pack [scale .s2  -from 100.0 -to 200.0 -length 100 -background yellow -borderwidth 5
   -font{Helvetica -18 bold} -foreground red -width 40 -relief ridge -orien horizontal
   -variable a -command "scaleMe .s2" ]
pack [ttk::progressbar .p1 -orient horizontal -length 200 -mode indeterminate -value 90]
pack [ttk::progressbar .p2 -orient horizontal -length 200 -mode determinate -variable a
   -maximum 75 -value 20]

執行上述程式後,將得到以下輸出:

Mega Widget Example

Tk - 字型

有一些部件支援顯示文字。大多數部件都提供字型屬性選項。建立字型的語法如下所示:

font create fontName options

選項

字型建立可用的選項如下表所示:

序號 語法和描述
1

-family familyName

字體系列的名稱。

2

-size number

字型的尺寸。

3

-weight level

字型的粗細。

下面顯示了一個字型建立的簡單示例:

#!/usr/bin/wish

font create myFont -family Helvetica -size 18 -weight bold 
pack [label .myLabel -font myFont -text "Hello World"]

執行上述程式後,將得到以下輸出:

Fonts Example

要獲取所有可用的字型,可以使用以下命令:

#!/usr/bin/wish

puts [font families]

執行上述命令後,將得到以下輸出:

{Abadi MT Condensed Extra Bold} {Abadi MT Condensed Light} {Al Bayan} {Al Nile}
{Al Tarikh} {American Typewriter} {Andale Mono} Arial {Arial Black}
{Arial Hebrew} {Arial Narrow} {Arial Rounded MT Bold} {Arial Unicode MS}
Athelas Avenir {Avenir Next} {Avenir Next Condensed} Ayuthaya Baghdad {Bangla MN}
{Bangla Sangam MN} {Baoli SC} Baskerville {Baskerville Old Face} Batang {Bauhaus 93}
Beirut {Bell MT} {Bernard MT Condensed} BiauKai {Big Caslon} {Book Antiqua}
{Bookman Old Style} {Bookshelf Symbol 7} Braggadocio {Britannic Bold} {Brush Script MT}
Calibri {Calisto MT} Cambria {Cambria Math} Candara Century {Century Gothic}
{Century Schoolbook} Chalkboard {Chalkboard SE} Chalkduster {Charcoal CY} Charter
Cochin {Colonna MT} {Comic Sans MS} Consolas Constantia {Cooper Black} Copperplate
{Copperplate Gothic Bold} {Copperplate Gothic Light} Corbel {Corsiva Hebrew} Courier
{Courier New} {Curlz MT} Damascus {DecoType Naskh} Desdemona {Devanagari MT}
{Devanagari Sangam MN} Didot {DIN Alternate} {DIN Condensed} {Diwan Kufi} {Diwan Thuluth}
{Edwardian Script ITC} {Engravers MT} {Euphemia UCAS} Eurostile Farah Farisi
{Footlight MT Light} {Franklin Gothic Book} {Franklin Gothic Medium}
Futura Gabriola Garamond {GB18030 Bitmap} {Geeza Pro} Geneva {Geneva CY}
Georgia {Gill Sans} {Gill Sans MT} {Gloucester MT Extra Condensed}
{Goudy Old Style} {Gujarati MT} {Gujarati Sangam MN} Gulim GungSeo {Gurmukhi MN}
{Gurmukhi MT} {Gurmukhi Sangam MN} Haettenschweiler {Hannotate SC} {Hannotate TC}
{HanziPen SC} {HanziPen TC} Harrington HeadLineA Hei {Heiti SC} {Heiti TC}
Helvetica {Helvetica CY} {Helvetica Neue} Herculanum {Hiragino Kaku Gothic Pro}
{Hiragino Kaku Gothic ProN} {Hiragino Kaku Gothic Std} {Hiragino Kaku Gothic StdN}
{Hiragino Maru Gothic Pro} {Hiragino Maru Gothic ProN}
{Hiragino Mincho Pro} {Hiragino Mincho ProN} {Hiragino Sans GB}
{Hoefler Text} Impact {Imprint MT Shadow} InaiMathi {Iowan Old Style} Kai Kailasa
{Kaiti SC} {Kaiti TC} {Kannada MN} {Kannada Sangam MN} Kefa {Khmer MN} {Khmer Sangam MN}
{Kino MT} Kokonor Krungthep KufiStandardGK {Lantinghei SC} {Lantinghei TC} {Lao MN}
{Lao Sangam MN} {Libian SC} {LiHei Pro} {LiSong Pro} {Lucida Blackletter} {Lucida Bright}
{Lucida Calligraphy} {Lucida Console} {Lucida Fax} {Lucida Grande} {Lucida Handwriting}
{Lucida Sans} {Lucida Sans Typewriter} {Lucida Sans Unicode} {Malayalam MN}
{Malayalam Sangam MN} Marion {Marker Felt} Marlett {Matura MT Script Capitals}
Meiryo Menlo {Microsoft Sans Serif} Mishafi Mistral {Modern No. 20} Monaco {MS Gothic}
{MS Mincho} {MS PGothic} {MS PMincho} {MS Reference Sans Serif} {MS Reference Specialty}
Mshtakan {MT Extra} Muna {Myanmar MN} {Myanmar Sangam MN} Nadeem {Nanum Brush Script}
{Nanum Gothic} {Nanum Myeongjo} {Nanum Pen Script} {New Peninim MT} {News Gothic MT}
Noteworthy Onyx Optima {Oriya MN} {Oriya Sangam MN} Osaka Palatino {Palatino Linotype}
Papyrus PCMyungjo Perpetua {Perpetua Titling MT} PilGi {Plantagenet Cherokee}
Playbill PMingLiU {PT Mono} {PT Sans} {PT Sans Caption} {PT Sans Narrow} {PT Serif}
{PT Serif Caption} Raanana Rockwell {Rockwell Extra Bold} Sana Sathu {Savoye LET}
Seravek Silom SimSun {Sinhala MN} {Sinhala Sangam MN} Skia {Snell Roundhand} {Songti SC}
{Songti TC} Stencil STFangsong STHeiti STIXGeneral STIXIntegralsD STIXIntegralsSm
STIXIntegralsUp STIXIntegralsUpD STIXIntegralsUpSm STIXNonUnicode STIXSizeFiveSym
STIXSizeFourSym STIXSizeOneSym STIXSizeThreeSym STIXSizeTwoSym STIXVariants STKaiti
STSong Superclarendon Symbol Tahoma {Tamil MN} {Tamil Sangam MN} TeamViewer8 {Telugu MN}
{Telugu Sangam MN} Thonburi Times {Times New Roman} {Trebuchet MS} {Tw Cen MT} Verdana
Waseem {Wawati SC} {Wawati TC} Webdings {Weibei SC} {Weibei TC} {Wide Latin} Wingdings
{Wingdings 2} {Wingdings 3} {Xingkai SC} {Yuanti SC} YuGothic YuMincho {Yuppy SC}
{Yuppy TC} {Zapf Dingbats} Zapfino {Apple Braille} {Apple Chancery} {Apple Color Emoji}
{Apple LiGothic} {Apple LiSung} {Apple SD Gothic Neo} {Apple Symbols}
AppleGothic AppleMyungjo {Monotype Corsiva} {Monotype Sorts}

Tk - 影像

Image 部件用於建立和操作影像。建立影像的語法如下:

image create type name options

在上述語法中,type 是 photo 或 bitmap,name 是影像識別符號。

選項

Image 建立可用的選項如下表所示:

序號 語法和描述
1

-file fileName

影像檔案的名稱。

2

-height number

用於設定部件的高度。

3

-width number

設定部件的寬度。

4

-data string

以 base 64 編碼的字串表示的影像。

下面顯示了一個 Image 部件的簡單示例:

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/Desktop/F Drive/pictur/vb/Forests/
   680049.png" -width 400 -height 400 
pack [label .myLabel]
.myLabel configure -image imgobj 

執行上述程式後,將得到以下輸出:

Image Example

Image 可用的函式如下表所示:

序號 語法和描述
1

image delete imageName

從記憶體中刪除影像,並視覺上刪除相關的部件。

2

image height imageName

返回影像的高度。

3

image width imageName

返回影像的寬度。

4

image type imageName

返回影像的型別。

5

image names

返回記憶體中存在的影像列表。

下面顯示了一個使用上述 Image 部件命令的簡單示例:

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/images/680049.png"
   -width 400 -height 400 
pack [label .myLabel]
.myLabel configure -image imgobj
puts [image height imgobj]
puts [image width imgobj]
puts [image type imgobj]
puts [image names]
image delete imgobj

一旦執行“image delete imgobj”命令,影像將從視覺上和記憶體中刪除。在控制檯中,輸出將類似於以下內容:

400
400
photo
imgobj ::tk::icons::information ::tk::icons::error ::tk::icons::
warning ::tk::icons::question

Tk - 事件

事件在其最簡單的形式中,可以透過命令來處理。事件處理的一個簡單示例是使用按鈕進行事件處理,如下所示:

#!/usr/bin/wish

proc myEvent { } {
   puts "Event triggered"
}
pack [button .myButton1  -text "Button 1"   -command myEvent]

執行上述程式後,將得到以下輸出:

Event Example

下面顯示了一個用於顯示延遲文字動畫事件的簡單程式:

#!/usr/bin/wish

proc delay {} {
   for {set j 0} {$j < 100000} {incr j} {} 
}

label .myLabel -text "Hello................" -width 25
pack .myLabel
set str "Hello................"
for {set i [string length $str]} {$i > -2} {set i [expr $i-1]} {
   .myLabel configure -text [string range $str 0 $i]
   update
   delay
}

執行程式後,將以動畫方式獲得以下輸出:

Event Example3

延遲後的事件

延遲後事件的語法如下所示:

after milliseconds number command

下面顯示了一個用於顯示延遲後事件的簡單程式:

#!/usr/bin/wish

proc addText {} {
   label .myLabel -text "Hello................" -width 25
   pack .myLabel
}
after 1000 addText

執行程式後,將在 1 秒後獲得以下輸出:

Event Example2

您可以使用 after cancel 命令取消事件,如下所示:

#!/usr/bin/wish

proc addText {} {
   label .myLabel -text "Hello................" -width 25
   pack .myLabel
}
after 1000 addText
after cancel addText

事件繫結

事件繫結的語法如下所示:

bind arguments 

鍵盤事件示例

#!/usr/bin/wish

bind .  {puts "Key Pressed: %K "}

執行程式並按下字母 X 後,將獲得以下輸出:

Key Pressed: X 

滑鼠事件示例

#!/usr/bin/wish

bind .  {puts "Button %b Pressed : %x %y "}

執行程式並按下滑鼠左鍵後,將獲得類似於以下內容的輸出:

Button 1 Pressed : 89 90 

將事件與按鈕連結的示例

#!/usr/bin/wish

proc myEvent { } {
   puts "Event triggered"
}
pack [button .myButton1  -text "Button 1"   -command myEvent]
bind .  ".myButton1 invoke"

執行程式並按下 Enter 鍵後,將獲得以下輸出:

Event triggered

Tk - 視窗管理器

視窗管理器用於處理頂級視窗。它有助於控制視窗的大小、位置和其他屬性。在 Tk 中,. 用於引用主視窗。視窗命令的語法如下所示:

wm option window arguments

Tk wm 命令可用的選項列表如下表所示:

序號 語法和描述
1

aspect windowName a b c d

嘗試將寬度/高度的比率保持在 a/b 和 c/d 之間。

2

geometry windowName geometryParams

用於設定視窗的幾何形狀。

3

grid windowName w h dx dy

設定網格尺寸。

4

group windowName leaderName

leaderName 指定一組相關視窗的領導者。

5

deiconify windowName

如果視窗最小化,則將其恢復到正常狀態。

6

iconify windowName

最小化視窗。

7

state windowName

返回視窗的當前狀態。

8

withdraw windowName

取消對映視窗,並將其詳細資訊從記憶體中移除。

9

iconbitmap windowName image

設定或返回圖示點陣圖。

10

iconPhoto 視窗名稱 圖片

設定或返回圖示圖片。

11

command 視窗名稱 命令字串

在 WM_COMMAND 屬性中記錄啟動命令。

12

protocol 視窗名稱 引數

註冊一個命令來處理協議請求名稱,可以是 WM_DELETE_WINDOW,

WM_SAVE_YOURSELF,

WM_TAKE_FOCUS。例如:wm protocol。

WM_DELETE_WINDOW 退出。

13

minsize 視窗名稱 尺寸

確定視窗的最小尺寸。

14

maxsize 視窗名稱 尺寸

確定視窗的最大尺寸。

15

title 視窗名稱 標題文字

確定視窗的標題。

16

attributes 子選項

有很多屬性可用,例如 alpha、全屏等。

以上一些命令在以下示例中使用 -

#!/usr/bin/wish

wm maxsize . 800 800
wm minsize . 300 300
wm title . "Hello"
wm attributes . -alpha ".90" 
wm geometry . 300x200+100+100

執行上述程式後,將得到以下輸出:

Window Manager

如您所見,alpha 是可用屬性之一。常用子命令列表如下 -

序號 語法和描述
1

-alpha 數字

設定視窗的 alpha 值。

2

-fullscreen 數字

數字可以是 0 表示普通螢幕,1 表示全屏。

3

-topmost 數字

設定或返回視窗是否置頂。值可以是 0 或 1。

建立視窗

我們可以使用 toplevel 命令建立視窗,以下是一個示例 -

#!/usr/bin/wish

toplevel .t

執行上述程式後,將得到以下輸出:

Window Manager2

銷燬視窗

我們可以使用 destroy 命令銷燬視窗,以下是一個示例 -

#!/usr/bin/wish

destroy .t

以上命令將銷燬名為 .t 的視窗。

Tk - 幾何管理器

幾何管理器用於管理視窗和其他框架的幾何形狀。我們可以用它來處理視窗和框架的位置和大小。 佈局部件 用於此目的。

定位和調整大小

視窗定位和調整大小的語法如下所示 -

wm geometry . wxh+/-x+/-y

這裡,w 指的是寬度,h 指的是高度。後面跟著一個 '+' 或 '-' 符號,以及表示螢幕上 x 位置的數字。類似地,後面的 '+' 或 '-' 符號以及數字表示螢幕上的 y 位置

以下是一個關於以上語句的簡單示例 -。

#!/usr/bin/wish

wm geometry . 300x200+100+100

執行上述程式後,將得到以下輸出:

GeometryManager1 Example

網格幾何

網格幾何的語法如下所示 -

grid gridName -column number -row number -columnspan number -rowspan number

列、行、列跨度或行跨度有助於提供網格幾何。

以下是一個關於以上語句的簡單示例 -

#!/usr/bin/wish

frame .myFrame1 -background red  -height 100 -width 100
frame .myFrame2 -background blue -height 100 -width 50
grid .myFrame1 -columnspan 10 -rowspan 10 -sticky w
grid .myFrame2 -column 10 -row 2

執行上述程式後,將得到以下輸出:

Grid Geometry
廣告

© . All rights reserved.