• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 使用 Tcl 來組織桌面

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    大多數圖形用戶界面 (GUI) 桌面為您提供了豐富的配置選項。您可以通過編寫腳本的方式對一組 GUI 小部件進行配置,這樣可以超出桌面通常所能完成的配置工作。 大多數計算機用戶主要通過某種形式的圖形用戶界面 (GUI) 來進行與工作站的交互。在 Microsoft Wind
    大多數圖形用戶界面 (GUI) 桌面為您提供了豐富的配置選項。您可以通過編寫腳本的方式對一組 GUI 小部件進行配置,這樣可以超出桌面通常所能完成的配置工作。

    大多數計算機用戶主要通過某種形式的圖形用戶界面 (GUI) 來進行與工作站的交互。在 Microsoft® Windows® 的世界里,對這種界面進行了嚴格的控制。UNIX® 世界則與之相反,為實現不同的 GUI 提供了真正的自助方式,并且這些 GUI 的功能各不相同。這些 GUI 通常被稱為窗口管理器,因為它們占用了 X-Windows 細節層上面的一層,并且它們對窗口進行管理。

    UNIX 通常提供了充分的自由和選擇系統的工作方式的權利。不同的個性類型需要不同的系統功能,UNIX GUI 則為每個用戶都準備了相應的特性。它們從最低限度的窗口管理器,如 twm,到大型的且功能齊全的工具,如 GNOME 和 KDE (K Desktop Environment)。其中包括了大量的、各種形式的其他版本和功能。(要查看目前最常用的窗口管理器列表,請參閱參考資料部分。)

    您可能需要以編寫腳本的方式對桌面進行控制,以便利用相應的功能編寫程序,而無需花費大量的時間來學習如何完成該項任務?;蛘?,您可能更喜歡可編程方式的窗口管理器,這樣您就可以像控制命令行接口那樣來控制窗口。最低限度的窗口管理器是可以同時滿足這兩種需求的一個不錯的選擇,它運行于功能強大的窗口管理器之上,僅允許您輕松靈活地完成腳本編寫工作。

    Tcl/Tk 可以為您提供幫助

    該工具最初由 University of California, Berkeley 的 John Ousterhout 博士開發,后來由 Sun Microsystems 和 Scriptics 對其進行了完善,工具命令語言 (Tool Command Language) 和 Tk GUI 工具包 (Tcl/Tk) 腳本語言提供了一種以最少的工作量來編寫 GUI 小部件的簡單而完美的方式。

    編寫計算機程序來完成某項任務通常至少涉及兩方面的問題:程序的形式以及程序的工作方式。Tcl/Tk 編程語言努力使程序的形式 問題變得更加容易,它使得您可以輕松地通過腳本編寫 GUI 小部件(如窗口和按鈕),并將其關聯于相應的過程(即程序的工作方式 的問題)。

    需要做些什么工作?

    干凈而整潔的桌面,這在虛擬和現實世界中都是很有好處的。整潔 意味著僅在桌面上準備一些可以完成大量工作的圖標。(這些圖標有時也稱為咖啡圖標,點擊這些圖標后,在其啟動所需的一組程序時,您可以起身去倒杯咖啡。)將幾個程序的執行組合成僅具有一個圖標的單個任務,這是一種很好的方法。

    例如,要撰寫類似本文這樣的文章,您可以用腳本編寫單個圖標,當點擊了這個圖標后,打開一個工作所需的 xterm、一個編輯 XML 文件的文本編輯器以及一個顯示該文章的瀏覽器。在單擊這個圖標后,啟動了所有這些工具,您可以按照需要對其進行配置,包括合適的屏幕大小、工作目錄集和所有打開的并可對其進行操作的文件。這就是編寫腳本!

    您可以使用 bash shell 腳本來實現相同的目的并將腳本關聯于一個桌面圖標,但是 Tcl/Tk 為 GUI 方面提供了更好的接口。

    作者的助手

    清單 1 介紹了一個 Tcl/Tk 程序,它實現了前一節中所描述的情況,即單擊一個圖標后啟動所有的相關任務。除了啟動 xterm、編輯器和瀏覽器之外,它還提供了一個按鈕,您可以在任何時候單擊該按鈕來運行 IBM 提供的一個腳本,以將文章從 XML 轉換為 HTML。


    清單 1. 作者的助手
    #!/usr/bin/wish -f
                # 1 -- How should it look?
                set PageTitle "IBM developerWorks Articles -- Studio B"
                set InitDir "/home/bill/StudioB/developerworks"
                set ChooseDir "Choose an Article Directory"
                frame .rc -borderwidth 2
                wm title . $PageTitle
                wm resizable . 0 0
                button .rc.b -width 20 -text "Rebuild Article" -command {rebuild-article}
                button .rc.c -width 20 -text "Exit" -command {exit}
                pack .rc
                pack .rc.b
                pack .rc.c
                grid .rc.b .rc.c -sticky ew
                # 2 -- What should it do?
                proc rebuild-article {} {
                exec ./dw-transform.sh &
                }
                wm geometry . =336x32+0+707
                set dir ""
                while {$dir == ""} {
                set dir [tk_chooseDirectory             -initialdir $InitDir             -title $ChooseDir]
                }
                cd $dir
                exec nedit -geometry 150x48+0+0 index.xml &
                exec konsole &
                exec opera -geometry 1024x680+0+0 index.html &
                

    您可以按下鼠標左鍵從屏幕搜集這段代碼,并搜集其中的所有內容。然后啟動您最喜愛的編輯器,單擊鼠標中鍵將這段文本粘貼到編輯器中。將文件保存為 article.tcl,并使用 chmod 命令使其具有可執行權限:

    $ chmod +x article.tcl
                

    因為窗口管理器和硬件可能有所不同,甚至可能沒有鼠標中鍵,所以這里的說明可能與您所需要的并不完全相同。在這種情況下,您可以找人提供幫助。

    下一部分將對該程序中的部分內容進行研究。

    變量

    代碼的第一部分中使用了傳統的 UNIX #! 字符串來運行名為 wish 的 Tcl/Tk 解釋器。-f 開關告訴 wish 運行該腳本,然后退出。

    在這之后是一段注釋,用 # 表示,以 How should it look? 作為代碼塊的開始,緊隨其后對字符串變量進行了設置。像這樣將文本安排在代碼的上方,通常是一個很好的編程習慣:

    #!/usr/bin/wish -f
                # 1 -- How should it look?
                set PageTitle "IBM developerWorks Articles -- Studio B"
                set InitDir "/home/bill/StudioB/developerworks"
                set ChooseDir "Choose an Article Directory"
                

    Tk GUI 代碼

    這一小塊代碼創建了一個帶有兩個并排的按鈕的窗口。就簡潔性而言,在定義窗口和小部件方面,很難有能夠超過 Tk 的:

    frame .rc -borderwidth 2
                wm title . $PageTitle
                wm resizable . 0 0
                button .rc.b -width 20 -text "Rebuild Article" -command {rebuild-article}
                button .rc.c -width 20 -text "Exit" -command {exit}
                pack .rc
                pack .rc.b
                pack .rc.c
                grid .rc.b .rc.c -sticky ew
                

    frame 命令創建了一個稱為 .rc 的窗口,其邊界寬度為 2 個像素。wm 命令告訴基礎窗口管理器使用 PageTitle 對最前面的窗口(. 通常表示最前面)進行命名,接下來的 wm 命令禁止用戶調整其大小。然后對兩個按鈕進行了定義,并將它們放入到水平的網格中。

    按鈕代碼

    IBM 提供了一段程序來將文章(以 XML 格式編寫)轉換為外觀類似于 developerWorks 站點這樣的 Web 頁面 (HTML)。當您單擊同名的按鈕時,rebuild-article 過程調用了這段腳本。在該腳本運行結束后,將顯示一個對話框,用以描述將 XML 轉換為 HTML 的過程中所進行的操作,其中包括相應的錯誤消息(如果有的話)。如果這段程序告訴您已經創建了 index.html 文件,那么您可以單擊 OK,讓瀏覽器獲得焦點,并刷新頁面以查看新的文檔:

    proc rebuild-article {} {
                exec ./dw-transform.sh &
                }
                

    啟動代碼

    在啟動代碼中,wm geometry . =336x32+0+707 將桌面擴展窗口放置在 1024 x 768 桌面的底部。然后,該段代碼打開了一個對話框,它允許您選擇需要進行轉換的文章。最后,它將文章的目錄作為當前的工作目錄,并啟動編輯器 (nedit)、xterm (konsole) 和瀏覽器 (Opera)。在任務開始執行前對所有的這些內容進行正確的配置:

    wm geometry . =336x32+0+707
                set dir ""
                while {$dir == ""} {
                set dir [tk_chooseDirectory             -initialdir $InitDir             -title $ChooseDir]
                }
                cd $dir
                exec nedit -geometry 150x48+0+0 index.xml &
                exec konsole &
                exec opera -geometry 1024x680+0+0 index.html &
                

    對于這個 Tcl/Tk 程序,可以在很多方面進行改進。添加創建新文章的按鈕或將所有的文章備份到存檔的按鈕,這些都是值得進行的改進,并且 Tcl/Tk 讓您可以輕松地完成這些工作。您還可以設置首選編輯器、xterm 和瀏覽器。您可以隨意地對其進行實驗,絕不要將這個桌面擴展僅用于為 IBM 撰寫文章:可以對其進行修改,以啟動一個編程環境或 Web 技術環境。

    一個 50 行代碼的科學計算器

    現在,您將通過一個更加復雜的 Tcl GUI 程序來組織桌面:通過僅 50 行代碼編寫的一個科學計算器(請參見清單 2)。這個計算器可以對通過鍵盤或 GUI 按鈕輸入的表達式進行計算。如果您輸入一個無效的表達式,其文本將變為紅色。與清單 1 中的程序一樣,您可以將這段代碼從屏幕搜集到一個文件,并將其保存為 calc.tcl,使用 chmod 將其權限修改為可執行,然后運行該程序。


    清單 2. 50 行代碼的計算器
                #!/usr/bin/wish -f
                # 1 -- How should it look?
                set cflag 0; set nextkey 0
                wm title . "50-Line Calculator"
                wm resizable . 0 0
                grid [entry .display -textvariable expression -justify right] -columnspan 6
                focus .display
                bind .display <Return> equals; bind .display <KP_Enter> equals
                foreach row {
                {7 8 9 + -  sin(}
                {4 5 6 * /  cos(}
                {1 2 3 ( )  tan(}
                {C 0 . = Pi log(}
                } {
                foreach key $row {
                switch -- $key {
                C       {set string {set cflag 1; set expression ""}}
                Pi      {set string pi}
                =       {set string equals}
                default {set string "press $key"}
                }
                lappend keys [button .[incr nextkey] -text $key -command $string]
                }
                eval grid $keys -sticky we
                set keys [list]
                }
                # 2 -- What should it do?
                proc press {key} {
                if $::cflag {
                set ::expression ""
                if ![regexp {[0-9().]} $key] {set ::expression $::results}
                .display configure -fg black
                .display icursor end; set ::cflag 0
                }
                .display insert end $key
                }
                proc pi {} {
                if $::cflag {set ::expression ""}
                lappend ::expression "3.14159265"
                .display icursor end; set ::cflag 0
                }
                proc equals {} {
                regsub {=.+} $::expression "" ::expression
                if [catch {lappend ::expression =             [set ::results [expr             [string map {/ *1.0/} $::expression]]]}] {
                .display configure -fg red
                }
                .display xview end; set ::cflag 1
                }
                

    這段代碼中存在一些假像,即將長代碼行劃分為較短的代碼行,但是您可以看到,Tcl/Tk 是一種非常簡潔的語言。允許您使用這么少的代碼行創建如此復雜的 GUI 程序的編程語言并不多見。

    主窗口

    除了用來運行解釋器的常規的 #! 代碼之外,還設置了一些變量:cflag 用來控制主數據條目小部件 .display 如何搜集相應的字符,而 nextkey 則是在構建鍵數組時所使用的索引。然后,與前一個程序相同,設置窗口標題文本并禁止用戶調整其大小。

    在這之后,定義了計算器的 display 小部件。這里有幾個內容需要說明一下:與大多數計算器的外觀一樣,文本通常是右對齊的,所以從控件的右邊開始搜集鍵值,并向左邊進行滾動。動詞 focus 使 display 獲得焦點,所以您可以使用鍵盤或 GUI 按鈕來輸入表達式。然后,將代碼綁定到按下計算器的 Enter 鍵時或鍵盤 Enter 鍵按下時需要執行的操作,這樣就完成了 display 小部件:

    #!/usr/bin/wish -f
                # 1 -- How should it look?
                set cflag 0; set nextkey 0
                wm title . "50-Line Calculator"
                wm resizable . 0 0
                grid [entry .display -textvariable expression -justify right] -columnspan 6
                focus .display
                bind .display <Return> equals; bind .display <KP_Enter> equals
                

    計算器的小鍵盤

    這段代碼動態地構建了計算器小鍵盤上相應的鍵,通過 display 中的文本定義了每個按鈕,在 C、Pi 和 = 鍵的情況下,當按下這些鍵時需要執行一個特殊的過程。像 Tcl/Tk 這樣,允許您使用這么少的代碼行來定義這么多小部件的 GUI 程序的編程語言并不多見。

    foreach row {
                {7 8 9 + -  sin(}
                {4 5 6 * /  cos(}
                {1 2 3 ( )  tan(}
                {C 0 . = Pi log(}
                } {
                foreach key $row {
                switch -- $key {
                C       {set string {set cflag 1; set expression ""}}
                Pi      {set string pi}
                =       {set string equals}
                default {set string "press $key"}
                }
                lappend keys [button .[incr nextkey] -text $key -command $string]
                }
                eval grid $keys -sticky we
                set keys [list]
                }
                

    計算器的功能

    僅通過 3 個過程,就可以定義計算器所需的所有功能。請記住,在該程序運行時,操作集中在 display 小部件的內容上。當按下 = 鍵或 Enter 鍵時,expr 函數將對這些內容進行計算。

    當按下大多數 GUI 按鈕時,將使用 press 過程。其目的是將該按鈕的名稱文本添加到 display 和 expression 字符串的結尾處,而這個表達式將在以后進行計算。當設置了 cflag 時,將清除該表達式,為 next 表達式的輸入和計算做準備:

    # 2 -- What should it do?
                proc press {key} {
                if $::cflag {
                set ::expression ""
                if ![regexp {[0-9().]} $key] {set ::expression $::results}
                .display configure -fg black
                .display icursor end; set ::cflag 0
                }
                .display insert end $key
                }
                

    pi 過程將 pi 的值插入到 display 和 expression 變量:

    proc pi {} {
                if $::cflag {set ::expression ""}
                lappend ::expression "3.14159265"
                .display icursor end; set ::cflag 0
                }
                

    當按下 = 鍵或其中一個 Enter 鍵時,將執行 equals 過程。通過使用 Tcl/Tk 的功能強大的 expr 動詞和完成計算任務的數學代碼庫,實現了對表達式的計算,并且將結果保存到了 results 變量。如果發生輸入錯誤,如不匹配的括號,將通過 expr 拋出 catch 錯誤代碼,并且將 display 的顏色設置為紅色:

    proc equals {} {
                regsub {=.+} $::expression "" ::expression
                if [catch {lappend ::expression =             [set ::results [expr             [string map {/ *1.0/} $::expression]]]}] {
                .display configure -fg red
                }
                .display xview end; set ::cflag 1
                }
                

    根據 expr 動詞的相關文檔的顯示,它可以處理許多其他的數學函數,如 asin、acos、atan、指數、地板函數等等。您可以使用鍵盤輸入這些表達式,然后觀察 expr 的工作,現在您已經有了足夠的知識來修改該計算器代碼,以添加支持這些函數的按鈕。要了解更多的相關信息,請訪問參考資料部分中列舉的 Tcl/Tk 關鍵字。

    純 Tcl 桌面

    許多人都沉迷于使用 Tcl/Tk 來編寫 GUI 腳本的強大功能,他們已經編寫出了各種純 Tcl/Tk 的編輯器、瀏覽器、文件和桌面窗口管理器。參考資料部分中包括了其中部分內容的列表。

    結束語

    每一項勾畫出現代世界美好生活的杰出發明的出現,都是因為有的人不滿足于現狀并且決定對其進行積極的改變。您可以通過技術來改進世界,通過編寫腳本為工作站設計新的桌面并體會其中的樂趣,這可能會開啟通往其他具有深遠意義的觀念的大門。祝您編寫腳本愉快!

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>