天天看點

tk資料

hello world:

讓我們開始,作為其他教程的開始, 以"hello world"程式建立一個檔案 叫做hello.pl 

鍵入下面的内容到它這裡:

#!/usr/local/bin/perl

use tk;

# main window

my $mw = new mainwindow;

my $label = $mw -> label(-text=>"hello world") -> pack();

my $button = $mw -> button(-text => "quit",

-command => sub { exit })

-> pack();

mainloop;

第2行 use tk, 告訴解釋器 我們的程式使用tk子產品  這行是必須的 在所有的gui 程式裡

當解釋器遇到這行時,它會加載tk元件 來建立項目。

第三行  這是一行注釋  任何行以#開始的是一個注釋是不被程式使用的 

這是用于程式員來交流的 一個程式員不能被期望記住一個腳本的任何東西

是以使用一個注釋來寫下 在下次它需要編輯的時候,他可以讀注釋和了解程式

第四行,my $mw = new mainwindow; 會建立一個windows 窗體 gui元素會被放置 

變量$mv 是mainwindow類型的一個對象 , 我們需要這個元素當我們需要放置任何部件的時候

第五行 $mw -> label(-text=>"hello world") -> pack();

标記為标簽和寫"hello world" ,你可以改變文本到任何你想要标注的指令結構

$label 這個變量配置設定到特定的部件 部件必須有一個唯一的變量 

這個名字可以用于當部件被通路

$mv->  $mv 是一個mainwindow 的部件 我們需要放置我們的label部件在這個窗體内

label(-text=>"hello world") ’label' 是部件的名字,一個部件是一個使用者接口對象在圖形使用者接口

我們隻是說 這是對象的名字 ,出現在螢幕上  這裡有很多其他的部件 如果你想要顯示一個按鈕,

你使用button 部件  對于text 你使用text 部件

­text=>"hello world" 這個選項對于部件 這個選項 says  這個部件必須給定一個檔案 "hello

world" 選項 根據部件 一個按鈕部件 沒有必要有所有的label部件選項 

請注意 操作符用于這裡是 '=>' 相對于之前使用-> 在 $mw ->

一個使用減号 當另外一個使用=号 ,不要混淆這個兩個。

你可以保持寫其他的選項也可以寫在這裡 比如,讓我們做一個label 用于顯示文本

”hello world"  

$mw -> label(-text=>"hello world",-font=>"courierfont",-relief=>"raised") ->

pack();

在這個例子, 更多的選項被使用 前面的選項是用于哪個front 必須被使用讓文本和

告訴是否應該出現raised,sunken,flat etc 對于一個特定的部件,

閱讀手冊 perl讓每個部件和每個選項

所有的選項必須單獨的通過逗号分隔,這行是有一點難閱讀的 随着選項的增加

$mw -> label(-text=>"hello world",

-font=>"courierfont",

-relief=>"raised")

下一個是-> pack();  這個會pack 部件  '$label'  到windows '$mv' 'pack'是一個布局管理器

另外一個布局管理器是grid ,我更喜歡grid布局, 把所有的都放在一行是很難受的 

你可以放在另起一行:

my $label = $mw -> label(-text=>"hello world")

在這個例子中,pack 沒有選項

-> pack(-side=>"left",

-anchor=>'w')

你不需要把pack部件放在相同的行, 但是在小的程式是友善的。

my $label = $mw -> label(-text=>"hello world"); #we created the widget

$label -> pack(-side=>"left", -anchor=>'w'); #we pack it in another line

會建立和顯示 一個按鈕  部件變量是 '$button'  當我們檢視這個選項,

我們會發現2個選項 'text' 和'command' 

給定的文本是quit

是以按鈕會有text "quit" ,指令選項 決定 會發生什麼 當使用者點選按鈕

你可以指定一個函數來執行當使用者點選按鈕,在這種情況下 程式會退出 當這個按鈕被執行

-command =>\&exitprogam)

sub exitprogam {

$mw->messagebox(-message=>"goodbye");

exit;

}

接下來的行 mainloop 是main loop 或者事件循環 讓job 來借助回調來響應事件。

比如按鈕按下 或者定時器到期 如果 這行丢失, 程式會運作和退出不等待使用者做任何事情

widgets 1 : button, entry, label   部件 1:按鈕,輸入框,标簽

一個部件是一個使用者接口對象在x圖形使用者接口, 讓我們隻是說對象的名字出現在螢幕

這裡有很多類型部件,你需要顯示在一個按鈕,你使用按鈕部件 

對于文本, 你使用文本部件 用于輸入

my $widgetvariable = $window ­> widgettype(?option 1=>value 1, ?option 2=>value 2 ??) ­> pack();

三件事情需要說明關于部件

第一是部件變量 這個我已經在之前解釋過了 

所有部件的部件變量必須唯一,會用于當部件需要2次通路的時候

每個部件有一些選項 可以 用來配置它

這個通常在部件被定義時候處理,但是它也能在後面處理 

最後的事情是每個部件有一些指令, 也用來配置或者做一些事情。

但是在我們開始前,我們需要知道一點關于pack指令我已經之前解釋了

但是多做幾次你不需要push back 按鈕pack 是一個布局管理器另外一個部件管理器是grid

我們後面會介紹 pack相比grid是更加簡單的 

 $hello ­> pack,告訴 解釋器來pack部件叫做$hello ­

按鈕:

這會讓一個按鈕配置執行一些代碼, 當button 被按後 這個會指向一個函數

是以當按鈕被按後,函數會運作一個按鈕顯示如下 按鈕時建立使用html 輸入tag

some options

­text=>"text" text will be the text displayed on the button

­command=>callback callback will be the code that is called when the button is pushed

my $but = $mw -> button(-text => "push me",

-command =>\&push_button);

$but -> pack();

#this is executed when the button is pressed

sub push_button {

print "xxxxxxxxxx\n";

點選一個 'push me'按鈕,就會輸出一次。

你可能注意到 我使用了\ 在指令回調函數 (-command =>\&push_button);)

entry  輸入框

一個entry 是一個部件顯示一個一行文本串允許使用者輸入和編輯文本

當一個entry 已經輸入,插入的遊标表明 新的字元可以被插入到一個空的元素 

一些選項:

­width=>number         輸入框的寬度 應該是一個整數

­textvariable=>\$variable   變量的内容會顯示在部件裡,如果text 在部件裡被編輯,

變量會被自動編輯

­state=>state   輸入域的狀态可以是 normal, disabled, or readonly 如果它是隻讀的,text不能被編輯

一些指令:

文法                        描述                                 例子

$widget ­> get();          文本在輸入框可以被拿到通過這個指令    $name = $ent ­> get();

$widget ­> delete(first?,last?);

 删除一個或者多個entry的元素  first 是第一個字元index 來删除

 last 是在最後一個字元index 來删除 

 #!/usr/local/bin/perl

#gui building area

my $ent = $mw -> entry() -> pack();

$ent -> insert('end',"hello");

在尾部插入 hello 

label  标簽:

這個部件顯示文本資訊:

­text => "text"       text will be the text displayed on the button

                      text 将會是text顯示在按鈕上

­font => font

指定字型 來使用 當繪制文本在部件内,你可以指定font 或者事件循環

你可以指定它格式  "fontname size style" 

widgets 2 : frame, text, scrollbar, scale   窗體,文本,滾動表, 刻度尺

frame 窗體:

一個架構是一個簡單的部件它的主要目的是作為一個間隔裝置 或者 容器 

對于複雜的windows 布局   frame唯一的功能是它的背景顔色和一個可選的3-d

邊界 來讓frame 出現 raised or sunken

frame 可以被建立像任何其他的部件一樣:

my $mw = new mainwindow; # main window

my $frm = $mw -> frame();

為了放置其他的部件在窗體裡,你應該使用frame 部件變量作為它的parent

通常 parent 是'$mw' 或者 mainwindow

但是我們希望放置一個部件在窗體内, 使用frame 變量 ('$frm' in this case) in

place of '$mw' like this

my $lab = $frm_name -> label(-text=>"name:") -> pack();

text

一個文本部件顯示一行或者多行文本,允許文本被編輯類似于entry部件 

$widget ­> get(index1, ?index2 ?);

傳回一個字元串從文本, 傳回的值會是所有的字元串在text裡 從index=index1開始和index=index2結束

(字元集在index2不會被傳回)

如果index2 被省略 那麼單個字元在index1 被傳回。

注意text的index 不同于 entry部件  

scrollbar  滾動條

一個滾動條部件是一個部件顯示2個箭頭, 在滾動條兩端,在中間的部分是一個滑動塊

它提供的資訊是關于 可見的在一個相關的框框  顯示一些排序的内容

­ipadx => amount

指定水準内部填充 留下在slaves兩邊的數量,這個空間是被增加到slave的邊境

­ipady => amount  指定垂直的内部填充留給slave兩端的 

­padx => amount  指定水準外部填充留給slave兩邊的數量,

在螢幕單元 amount 可能是兩個值的清單來指定填充單獨額left或者right

­pady => amount  指定崔志外部填充留給slave頂和底部的數量

­row => n  插入slave 讓它占據第n行 在grid 行号從0開始 

如果這個選項沒有指定, slave會被安排在相同的行和先前的slave 被指定在這個請求給grid

­column => n

插入到 slave讓它占據n列在grid選項 和-row類型

­rowspan => n

插入slave 讓它占據n行 在grid裡 預設是一行

­columnspan => n

插入slave 讓它占據n列 在grid裡

使用grid 需要一些經驗,但是你知道html 它會幫助你很多 

行和列就像html的表格,盡管代碼不同

scale 刻度尺:

dialogs: 對話框

對話框可以被稱為元素在一個程式裡,分離它本身從main windows 

這是一個非常一般的定義和有很多問題但是此刻,它将為tk提供很多的對話框:

messagebox: 消息框

這個程式建立和顯示一個應用指定的消息視窗,一個按鈕和一組按鈕 每個按鈕在消息框是用一個唯一的

象征性符号表示(檢視 類型選項)

在消息視窗出現後,messagebox 等待使用者來選擇一個

 一些選項:

 ­default=>name         

 預設按鈕的符号名字對于這個消息框框(ok', 'cancel',and so on)