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)