官术网_书友最值得收藏!

2.7 邁向圖形化:dialog工具

在結束討論shell腳本程序之前,我們還將介紹一個特性。盡管嚴格來說,它并不是shell的一部分,但是在通常情況下,它僅僅在shell程序設計中有用,所以我們將在這里討論它。

如果你知道你的腳本程序只需要運行在Linux控制臺上,則可以使用dialog工具命令,它以一種非常整潔的方式潤色你的腳本程序。這個命令使用文本模式的圖形和色彩,但它的確提供了友好的面向圖形的解決方案。

一些Linux發行版默認并沒有安裝dialog工具。例如,對于Ubuntu來說,你可能必須添加公開維護的套件庫來找到一個現成的版本。在其他Linux發行版中,你可能會找到一個已安裝的替代工具gdialog。它和dialog工具非常相似,但它依賴GNOME用戶接口來顯示其對話框。然而,你得到的回報是你獲得了一個真正的圖形化界面。一般來說,你可以將任何使用dialog工具的程序中對dialog工具的調用替換為對gdialog工具的調用,從而獲得程序的一個圖形化版本。我們將在本節最后提供一個使用gdialog的程序示例。

dialog工具的整體思想非常簡單:一個帶有各種各樣參數和選項的程序,它可以顯示各種類型的圖形框,范圍涵蓋從最簡單的Yes/No框到輸入框,甚至菜單選項。這個工具通常在用戶執行某種類型的輸入后返回,返回結果可以通過退出狀態獲得,或在用戶輸入文本時,通過標準錯誤流來獲取。

在詳細介紹它之前,我們先來看一個非常簡單的使用dialog的例子。你可以在命令行上直接使用dialog,這對于程序的原型設計很有用。現在讓我們創建一個簡單的消息框,來顯示傳統意義上的第一個程序:

執行它就會在屏幕上顯示一個圖形化的消息框,你可以通過OK對話框關閉它(見圖2-3)。

圖2-3

現在你已看出dialog的使用非常容易,接下來我們對它的各種可能性進行詳細地介紹。表2-22列出了你可以創建的對話框的主要類型。

表2-22

還有一些其他的對話框類型(例如,進度框和密碼框)可用。如果你想了解更多不常用的對話框類型,你也可以參考在線手冊頁。

如果想獲得任何類型的允許文本輸入或進行選擇的對話框的輸出,你必須捕獲標準錯誤流,通常是把它指向某個臨時文件以便后續處理。要想獲得Yes/No對話框的輸出結果,只需查看它的退出碼,與所有設計良好的程序一樣,返回0表示成功(例如,選擇yes選項),返回1表示失敗。

所有的對話框類型都有各種各樣的用于控制的參數,比如控制顯示的對話框的大小和形狀。我們首先列出每種類型需要的參數(見表2-23),然后在命令行上演示其中一部分參數的用法。最后,你將看到一個簡單的將幾種對話框結合起來的程序。

表2-23

除此之外,所有的對話框類型都有幾個相同的參數選項。在此我們不一一列出,只介紹兩個選項:--title和—clear。前者用于指定對話框的標題,后者用來完成清屏操作。完整的選項列表請查詢手冊頁。

實驗 使用dialog工具

讓我們直接跳到一個很復雜的例子。一旦你理解了這個例子,所有其他的程序就非常簡單了!在這個例子中,你將創建一個標題為Check me的復選框,它包括一條提示信息Pick Numbers。復選框高15字符,寬25字符,每個選項高3個字符。最后,你列出要顯示的選項并設置了默認的開關選擇。

圖2-4顯示了該命令執行的結果。

圖2-4

實驗解析

在本例中,--checklist參數用于創建一個復選框。--title選項將標題設置為Check me,下一個參數是提示信息Pick Numbers。

你接下來設置對話框的大小。它高15行,寬25個字符,3行被用于菜單。這個大小并不是最合適的,但是你可以從中看到內容的排列方式。

選項的設置看上去有點棘手,但你只需要記住每個菜單選項有3個值:

? 編號;

? 文本;

? 狀態。

第一個菜單項的編號是1,顯示的文本是one,狀態設置為off。第二個菜單項的值分別是2、two和選中。依次繼續直到菜單項設置完畢。

是不是很容易?你可以在命令行上嘗試一下,看看它的使用有多么簡單。為了能將這些放在一個程序中,你需要能夠訪問用戶輸入的結果。這一點很容易實現,對于文本輸入,你只需要重定向標準錯誤流或檢查環境變量$?的內容,$?的值實際上就是前一個命令的退出狀態。

實驗 一個更復雜的使用dialog工具的程序

我們來看一個名為questions的簡單程序,它關注用戶的響應:

(1)首先,該程序通過顯示一個簡單的對話框來告訴用戶發生的事情。你不需要獲得返回值或任何用戶的輸入,所以這看起來非常簡單和友好:

(2)然后用一個簡單的yes/no對話框來詢問用戶是否要繼續操作。我們用環境變量$?來檢查用戶是否選擇了yes(返回碼是0)。如果用戶不想繼續操作,就使用一個簡單的信息框顯示信息,信息框在退出之前不需要用戶的輸入。

(3)我們使用一個輸入框來詢問用戶的姓名。重定向標準錯誤流2到臨時文件_1.txt,然后再將它放到變量Q_NAME中:

(4)現在顯示一個菜單,它有4個不同的選項。你再次重定向標準錯誤流并且把它裝載到一個變量中:

(5)用戶選擇的菜單項編號將被保存到臨時文件_1.txt中,同時這個結果被放入變量Q_MUSIC中,以便你對結果進行測試:

(6)最后,清除對話框并退出程序:

圖2-5顯示了屏幕上的輸出信息。

實驗解析

本例通過將dialog命令和一些簡單的shell編程語句相結合,講解了如何僅僅使用shell腳本來構建簡單的GUI程序。程序從一個簡單的歡迎頁面開始,然后使用一個簡單的--yesno對話框詢問用戶是否愿意繼續操作。程序使用變量$?來檢查用戶的回答。如果用戶同意,程序將獲得用戶的姓名并將它保存在變量Q_NAME中,然后使用--menu對話框詢問用戶喜歡哪種類型的音樂。通過將用戶選擇的菜單項編號保存到變量Q_MUSIC中,程序可以看到用戶的回答并給出適當的回應。

圖2-5

如果你運行的是一個基于GNOME的GUI,并且正在使用它提供的終端會話,你就可以使用gdialog命令來代替dialog。這兩個命令有著相同的參數,因此你只需將調用的命令從dialog改為gdialog即可,其他的代碼完全不需改動。圖2-6顯示了在Ubuntu系統中,使用上面腳本程序的gdialog版本時,屏幕的輸出結果。

圖2-6

這是從一個腳本程序中生成可用的GUI界面的非常簡單的方法。

主站蜘蛛池模板: 鸡泽县| 纳雍县| 增城市| 阳信县| 石嘴山市| 梅河口市| 绥滨县| 永春县| 金溪县| 万源市| 廉江市| 凤凰县| 揭东县| 九龙坡区| 乌兰县| 台中市| 斗六市| 陕西省| 东兰县| 焦作市| 江源县| 渭源县| 雷波县| 大同县| 甘肃省| 武义县| 济南市| 司法| 资源县| 新营市| 河间市| 黑水县| 饶阳县| 永定县| 柞水县| 星座| 罗源县| 兴文县| 南华县| 河北区| 丽水市|