欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用shell腳本創(chuàng)建好的圖形應(yīng)用程序

系統(tǒng) 1820 0

這是今天csdn的咨詢報道,我覺得非常實(shí)用,而且之前沒有關(guān)注過shell還有圖形的潛質(zhì),所以特此作個筆記。

http://sd.csdn.net/a/20110420/296194.html ,作者:Martin Streicher

對話UNIX:使用shell腳本創(chuàng)建好的圖形應(yīng)用程序

簡介: 命令行不適合于每一位用戶。事實(shí)上,一些用戶可能僅在握著鼠標(biāo)時才感到舒服。要僅使用 shell 來滿足這些用戶或構(gòu)建桌面應(yīng)用程序,可以向您的腳本添加一些 GUI。這里是一些具體做法。

如果您走進(jìn)一個擁擠的機(jī)房,可能會聽到有關(guān) “shebangs”、斜線、點(diǎn)、根、管道、端口等等這個那個的閑聊。如果講到 UNIX?,您無疑會理解本地術(shù)語 — 有關(guān) UNIX 的縮略詞、命令名、快捷鍵、選項、文件名和方言 — 且有賓至如歸的感覺。與其他藝術(shù)工作者一樣,UINX 用戶擁有廣泛的術(shù)語來描述其工作細(xì)節(jié)。

并非每個人都探討 UNIX;事實(shí)上,有些人可能發(fā)現(xiàn)命令行很復(fù)雜,令人卻步。此外,您可能不希望將全部命令行寄托給臨時或無經(jīng)驗的用戶。要幫助那些不習(xí)慣使用命令行的人,或構(gòu)建圍繞 shell 的自定義解決方案,您可以為您的腳本構(gòu)建 GUI。有了這樣的工具 — dialog 和 Zenity 是兩個值得一提的工具(參見 參考資料 ) — 您就可以使用對話框、文件瀏覽器和其他常見的 “windowing” 控件和技術(shù)來與您的用戶交互。事實(shí)上,對話框提供更多自然對話:您提出問題,請求響應(yīng),并相應(yīng)地予以響應(yīng)。

本期的 “對話 UNIX” 探討 dialog 和 Zenity,并展示如何將任何腳本轉(zhuǎn)化成一個令人信服的 GUI 應(yīng)用程序。對于傳統(tǒng)的、基于文本的界面使用 dialog,Zenity 提供現(xiàn)代風(fēng)格的視窗化桌面。

向任何 shell 腳本添加對話框

一個命令行實(shí)用程序通常提供足夠的選項來完全控制每個調(diào)用。一些 DOS 命令可能啟用或禁用一個特性,而其他 DOS 命令可能處理參數(shù),比如名稱列表。在命令行,您將(幾乎)所有信息呈現(xiàn)在前面,然后執(zhí)行任務(wù)。圖形應(yīng)用程序很不同。選擇是通過菜單、復(fù)選框和文件瀏覽器做出的。一個圖形應(yīng)用程序接受一點(diǎn)信息,處理它,然后通常要求獲得更多信息。據(jù)說 GUI 應(yīng)用程序是事件驅(qū)動的。

dialog 實(shí)用程序跨越兩個世界。當(dāng)您需要來自用戶的輸入時調(diào)用該實(shí)用程序,然后返回到您的腳本繼續(xù)處理提供的任何數(shù)據(jù)。換言之,如果您寫一個腳本來使用 dialog,就有可能忽略命令行參數(shù),而是使用 dialog 在必要時發(fā)出提示信息。

如果您的系統(tǒng)缺少 dialog 實(shí)用程序,您可以輕松使用當(dāng)前版本自帶的包管理器來安裝它,或者您可以直接通過源代碼編譯它。例如,如果您的系統(tǒng)使用 Aptitude,您可以通過如下命令安裝 dialog:

      
  1. sudoapt-getinstalldialog

否則就要通過源代碼編譯,可以下載維護(hù)人員 Thomas Dickey 的 Web 站點(diǎn)上的代碼(參見 參考資料 )并運(yùn)行典型的三個命令:./configure && make && make install:

      
  1. $wgethttp: //invisible-island.net/datafiles/release/dialog.tar.gz
  2. $tarxzfdialog.tar.gz
  3. $cddialog-1.1-20100428
  4. $./configure
  5. $make
  6. $sudomakeinstall

安裝完成之后,您的路徑中應(yīng)當(dāng)會有一個名為 dialog 的新實(shí)用程序。輸入 man dialog 來查看捆綁文檔。

dialog 使用起來很簡單:它僅是另一個 UNIX 命令。您使用命令選項顯示您選擇的對話框,然后捕獲結(jié)果并基于該值執(zhí)行一些邏輯。dialog 的一些變體直接將命令結(jié)果放在特殊的 shell 狀態(tài)變量 $? 中,您應(yīng)當(dāng)在 dialog 命令退出后立即保存或詢問該變量(因為隨后的一個命令會立即改變其值)。另外,通常更為復(fù)雜的 dialog 命令變體同時設(shè)置 shell 狀態(tài)變量并生成其他結(jié)果。為將事情簡單化,dialog 提供 --stdout 選項來將其結(jié)果發(fā)出到標(biāo)準(zhǔn)輸出,因而便于通過命令求值捕獲數(shù)據(jù)(帶左引號的命令和賦值語句的組合)。

例如,dialog --yesno 命令是最簡單的變體之一。它提出一個問題,提示做出是或否的響應(yīng),并返回 $? 中的 0 或 1,具體取決于用戶選擇了 “Yes” 還是 “No”。您可以測試 $? 的值并執(zhí)行一些條件代碼。這里是您可以添加到 shell 腳本的一個工作代碼段:

      
  1. dialog--yesno "Doyouwanttocontinue?" 00
  2. rc=$?
  3. if [ "${rc}" == "0" ];then
  4. echoYes
  5. else
  6. echoNo
  7. fi

--yesno 選項需要至少三個參數(shù):問題文本以及對話框本身的高度和寬度,后者用行和列度量。如果您不需要特定尺寸,總是可以為高度或?qū)挾仁褂?0,以自動調(diào)整對話框大小。(還有相對于窗口左下角放置窗口的選項。)圖 1 展示運(yùn)行中的 --yesno。

圖 1. --yesno 操作

--yesno 操作

dialog 選項 --calendar 呈現(xiàn)一個日歷來允許用戶選擇特定日期。如果用戶選擇一個日期,然后單擊 OK,命令返回 0。但是,如果用戶單擊 Cancel,命令返回 1。此外,如果用戶單擊 OK,命令將選定日期發(fā)出為標(biāo)準(zhǔn)輸出。這里是使用命令求值產(chǎn)生日期的一個例子:

      
  1. RESULT=`dialog--stdout--title "CALENDAR"
  2. --calendar "Pleasechooseadate..." 00912010`
  3. retval=$?

--title 選項使用下一個參數(shù)來將一個標(biāo)題添加到對話框,且可用于任何 dialog 命令。非常像 --yesno,您提供一些文本來提示用戶。接下來,選項 0 0 再次指定自動高度和寬度,選項 9 1 2010 分別指示日歷中顯示的初始日、月和年。選項卡和箭頭鍵改變?nèi)諝v并選擇一個日期。對話框退出后,如果 retval 是 0,RESULT 的值就是選定的日期。圖 2 顯示日歷對話框。

圖 2. 日歷對話框

日歷對話框

dialog 命令提供通常在圖形應(yīng)用程序中找到的大部分控件:

--infobox 僅僅展示信息:它不要求任何輸入。信息框仍然只是簡單地在屏幕上。要延長其顯示,在它和下一個命令之前置入一個 sleep 命令。

--input 收集單一輸入響應(yīng)。您可能會使用該命令來收集您的用戶的姓名或郵政編碼。

--textbox 顯示一個文本文件的內(nèi)容。如果文件超出對話框的垂直高度,一個控件支持簡單的向上和向下滾動。

--menu 和 --radiolist 提供一個選擇列表,供用戶進(jìn)行選擇。兩種對話框在功能上是等同的,但是略有不同的視覺風(fēng)格,以更好地模擬一個 GUI 可能展示的東西。特別地,--radiolist 命令呈現(xiàn) ( ) 來模擬單選按鈕。

--checklist 顯示用戶可單獨(dú)啟用或禁用的一個項目列表。

每個 dialog 變體的輸出不同,或是一個單一值,或是一列由空格分隔的帶引號值。例如,--checklist 是用于選擇一個或多個選項的一個不錯的控件,它發(fā)出一列帶引號值,其中每個值與一個啟用的選項相關(guān)。下面演示了一個操作示例:

      
  1. RESULT=`dialog--stdout
  2. --checklist "Enabletheaccountoptionsyouwant:" 10403/
  3. 1 "Homedirectory" on/
  4. 2 "Signaturefile" off/
  5. 3 "Simplepassword" off`

行 1、2 和 3 結(jié)尾的反斜杠(/)是延續(xù)標(biāo)記;從 RESULT 到 off` 的一切內(nèi)容是一個命令。如果用戶啟用了 Home directory 和 Simple password,$RESULT 將會是 "1" "3"。--checklist 的參數(shù)是高度和寬度,任何時間內(nèi)的列表元數(shù)量(如果有些項目被擋住,您可以通過滾動查看這些項目),以及清單選項(其中每個選項是一個值)、一個描述、在最初啟用或禁用該選項。

您可以隨時輸入 dialog --help 來查看常規(guī)列表,輸入 dialog 來查看特定選項。dialog 有無數(shù)用法。

有像素?使用 Zenity。

Zenity 是 UNIX 桌面,如同 dialog 是簡單的終端窗口。您可以使用 Zenity 從任何 shell 腳本打開 GTK+ 對話框。事實(shí)上,Zenity 與 dialog 有著許多相同的功能;惟一的區(qū)別在于,Zenity 在一個 X Window System 環(huán)境中工作。Zenity 與 GNOME 相捆綁。如果您不運(yùn)行 GNOME,可以單獨(dú)安裝 Zenity(但是,也要安裝大量 GTK+ 庫)。您還可以從 GNOME 項目頁面下載 Zenity 的源代碼(參見 參考資料 獲取鏈接)。

下面是一個簡單的例子。命令為:

      
  1. zenity--question--text "Doyouwanttocontinue?"

生成的結(jié)果如 圖 3 所示。(用于演示的機(jī)器在運(yùn)行 Ubuntu 10。)如果您單擊 OK,命令返回 0。否則,它返回 1。

圖 3. 一個簡單問題

一個簡單問題

如同 dialog,Zenity 有很多選項 — 甚至比 dialog 還多 — 但是選項命名貼切,因而不言自明。您可能發(fā)現(xiàn) Zenity 比 dialog 更有優(yōu)勢,特別是由于大部分計算機(jī)用戶都有某種 X 桌面。

Zenity 提供與 dialog 相同的許多控件。這里是收集名稱的一個代碼段:

      
  1. ENTRY=`zenity--entry--text "Pleaseenteryourname"
  2. --entry-text "Yourname" --title "Enteryourname"
  3. if [$?==0];then
  4. zenity--info--text "Hello$ENTRY/!"
  5. fi

再次說明,如果 zenity 的退出代碼是 0,那么 ENTRY 有某人的姓名。這里是為使用 Zenity 而重寫后的日歷示例:

      
  1. DATE=`zenity--calendar--day "9" --month "1" --year "2010" --format "%Y-%m-%d"
  2. if [$?==0];then
  3. echo$DATE
  4. fi

盡管 Zenity 更詳細(xì)一點(diǎn) — 例如,對于年、月、日有單獨(dú)的選項 — 其他 DOS 命令使您免于記住精確的參數(shù)使用順序。Zenity 的日歷還允許您指定輸出格式,即使用標(biāo)準(zhǔn) strftime() 代碼。該命令的結(jié)果類似于 2010-1-9,它表示 2010 年 1 月 9 日。

Zenity 還提供一個過程表來展示一個操作的狀態(tài)。它從標(biāo)準(zhǔn)輸入逐行讀取數(shù)據(jù)。如果一個行的前綴是井號(#),文本被更新為該行文本。如果一個行僅包含一個數(shù)字,百分比被更新為該數(shù)字。清單 1 展示 Zenity 文檔中的一個示例。

清單 1. Zenity 過程表

      
  1. #!/bin/sh
  2. (
  3. echo "10" ;sleep1
  4. echo "#Updatingmaillogs" ;sleep1
  5. echo "20" ;sleep1
  6. echo "#Resettingcronjobs" ;sleep1
  7. echo "50" ;sleep1
  8. echo "Thislinewilljustbeignored" ;sleep1
  9. echo "75" ;sleep1
  10. echo "#Rebootingsystem" ;sleep1
  11. echo "100" ;sleep1
  12. )|
  13. zenity--progress/
  14. --title= "UpdateSystemLogs" /
  15. --text= "Scanningmaillogs..." /
  16. --percentage=0
  17. if [ "$?" =-1];then
  18. zenity--error/
  19. --text= "Updatecanceled."
  20. fi

sub-shell(包含在括號中)執(zhí)行一系列任務(wù) — 在這個人為例子中 albeit sleep 延遲 — 且通過一個管道將輸出發(fā)出到一個 Zenity 過程表。在每一步之前,sub-shell 發(fā)出一個數(shù)字來推進(jìn)過程表,每個 --percentage 0 起始于 0,然后發(fā)出一個以 # 開頭的字符串來改變狀態(tài)消息。因此,過程表沿著步驟標(biāo)記腳本工作。如果 Zenity 的退出代碼是 -1,單擊的是 Cancel 按鈕。

再次說明,要使用 dialog 或 Zenity,用對話框替換您之前引用過命令行參數(shù)的代碼。用一個小創(chuàng)意,您可以將您的 shell 腳本轉(zhuǎn)化為一等桌面公民。

其他高級工具

有些時候,您可能發(fā)現(xiàn)您的需求超過了 shell 腳本以及 dialog 和 Zenity 工具的功能范圍之外。在那些實(shí)例中,您可能轉(zhuǎn)向 C/C++ 并為桌面構(gòu)建本機(jī)應(yīng)用程序,但是您還可以使用高級腳本語言和許多強(qiáng)大的 GUI 框架的語言綁定。

一個組合是 Ruby 腳本語言和 wxWidgets 框架的 Ruby 綁定。Ruby 是面向?qū)ο蟮摹⒏挥诒憩F(xiàn)力的且簡潔的,運(yùn)行于大部分操作系統(tǒng)之上。wxWidgets 框架還可用于每個主流平臺,包括 Mac OS X、Windows?、Linux? 和 UNIX。由于兩者都是可移植的,您可以用 Ruby 編寫一個應(yīng)用程序一次,然后隨處運(yùn)行它。另一個更簡單的選擇是 Shoes。盡管不如 wxWidgets 豐富,Shoes 學(xué)習(xí)和使用起來相當(dāng)簡單。清單 2 使用 70 行代碼實(shí)現(xiàn)了一個計算器。

清單 2. 用 Shoes 實(shí)現(xiàn)的一個計算器

      
  1. class Calc
  2. definitialize
  3. @number=0
  4. @previous=nil
  5. @op=nil
  6. end
  7. defto_s
  8. @number.to_s
  9. end
  10. (0..9).each do |n|
  11. define_method "press_#{n}" do
  12. @number=@number.to_i*10+n
  13. end
  14. end
  15. defpress_clear
  16. @number=0
  17. end
  18. { 'add' => '+' , 'sub' => '-' , 'times' => '*' , 'div' => '/' }.each do |meth,op|
  19. define_method "press_#{meth}" do
  20. if @op
  21. press_equals
  22. end
  23. @op=op
  24. @previous,@number=@number,nil
  25. end
  26. end
  27. defpress_equals
  28. @number=@previous.send(@op,@number.to_i)
  29. @op=nil
  30. end
  31. end
  32. number_field=nil
  33. number=Calc. new
  34. Shoes.app:height=>250,:width=>200,:resizable=> false do
  35. background "#EEC" .. "#996" ,:curve=>5,:margin=>2
  36. stack:margin=>2 do
  37. stack:margin=>8 do
  38. number_field=parastrong(number)
  39. end
  40. flow:width=>218,:margin=>4 do
  41. %w(789/456*123-0Clr=+).each do |btn|
  42. buttonbtn,:width=>46,:height=>46 do
  43. method= case btn
  44. when/[0-9]/; 'press_' +btn
  45. when 'Clr' ; 'press_clear'
  46. when '=' ; 'press_equals'
  47. when '+' ; 'press_add'
  48. when '-' ; 'press_sub'
  49. when '*' ; 'press_times'
  50. when '/' ; 'press_div'
  51. end
  52. number.send(method)
  53. number_field.replacestrong(number)
  54. end
  55. end
  56. end
  57. end
  58. end

對 Ruby 和 Shoes 的介紹不在本文討論范圍之內(nèi),但是這里是一些最重要的構(gòu)造:

大多數(shù) Ruby 類 Calc 使用 Ruby 的元編程功能,在運(yùn)行時為所有數(shù)字鍵和數(shù)學(xué)操作鍵定義功能。

代碼開頭 Shoes.app... 創(chuàng)建計算器的 GUI,為其呈現(xiàn)布局和按鈕。Shoes 提供兩個容器來裝配布局:stack 和 flow。一個 stack 是元素的一個垂直堆棧,其中每個元素直接放在前一個元素下面。一個 flow 盡量緊密地包裹元素,直至它達(dá)到其邊框局限,然后包裝其余的元素。(您可以將一個堆??醋魇且粋€ HTML <div>,將一個流看作 HTML <p>。)您可以使用 Ruby 塊創(chuàng)建一個堆?;蛞粋€流。

最里面的 flow 快循環(huán)創(chuàng)建應(yīng)用程序中的所有按鈕,并有效地將每個按鈕綁定到其方法。(case 語句返回一個方法名稱;number.send(method) 行調(diào)用實(shí)例化計算器上的那個方法。)

number_field.replace strong(number) 行通過最新計算結(jié)果更新計算器顯示。發(fā)出 number 致使類調(diào)用其自己的 to_s (“to string”) 方法。

其他腳本語言擁有類似的庫,且 Ruby 本身有更多選擇,包括 Ruby Cocoa,可使用 Ruby 在 Mac OS X 上開發(fā) Cocoa 應(yīng)用程序。選擇您喜歡的開源腳本語言,找到一個輕量級 GUI 工具包,然后開始編碼。

您不需要討厭的編譯器!

如果您已經(jīng)掌握了 shell 腳本編寫,將您的工作與 dialog 或 Zenity 結(jié)合起來,以增加互操作性。如果您需要的編程功能比 shell 提供的更多,考慮 Ruby 或 Python 這樣的語言以及任何窗口工具包。您無需一個編譯器來編寫良好的桌面應(yīng)用程序。

關(guān)于作者

Martin Streicher 是一位 Ruby on Rails 的自由開發(fā)人員和 Linux Magazine 的前任主編。Martin 畢業(yè)于 Purdue University 并獲得計算機(jī)科學(xué)學(xué)位,從 1986 年起他一直從事 UNIX 類系統(tǒng)的編程工作。他喜歡收集藝術(shù)品和玩具。

使用shell腳本創(chuàng)建好的圖形應(yīng)用程序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本不卡在线播放 | 国产视频网站在线观看 | 中文精品久久 | 日本高清免费h色视频在线观看 | 久久6699精品国产人妻 | 五月婷久久 | 成人免费毛片高清视频 | 中国精品久久 | 另类激情网 | 一级毛片在线观看视频 | 99热热精品 | 欧美日韩第二页 | 日韩精品一区二区在线观看 | 成人影视大全 | 久久精品一区二区三区四区 | 欧美视频区 | 亚洲婷婷综合中文字幕第一页 | 国产一区二区黑人欧美xxxx | 久久久久国产 | 成人午夜电影在线观看 | xy110.app| 猛龙怪客 | 成人免费淫片aa视频免费 | 蜜臀传煤mv在线观看 | 欧美日韩在线视频不卡一区二区三区 | 欧美一级二级视频 | 精品一区二区三区免费 | 成人自拍偷拍 | 欧美 亚洲 另类 激情 另类 | 欧美日本乱大交xxxxx | 国产亚洲精品久久久久久国 | 国产精品一区二区三区四区 | 国产在线aaa片一区二区99 | 日本高清色视频在线观看免费 | 国产成人偷拍 | 92精品国产自产在线 | 日韩成人高清 | 日韩成人在线播放 | 奇米777视频 | 在线成人 | 成人黄色免费观看 |