วิธีเพิ่ม GUI ให้กับ Linux Shell Scripts

เผยแพร่แล้ว: 2022-01-29

เปิดหน้าต่างข้อมูล zenity จากเทอร์มินัล Ubuntu

คุณสามารถใช้หน้าต่าง GUI, ตัวเลื่อน, ปุ่มตัวเลือก, แถบความคืบหน้า และอื่นๆ ในสคริปต์ทุบตีของคุณ เรียนรู้วิธีใช้ชุดเครื่องมือ zenity และปรับโฉมสคริปต์ Bash ของคุณ เราจะแสดงให้คุณเห็นว่า

การเขียนสคริปต์ Bash เป็นภาษาการเขียนโปรแกรมที่ทรงพลัง และเนื่องจากมันสร้างไว้ในเปลือก Bash จึงพร้อมให้ทุกคนใช้งานได้ เป็นภาษาที่ง่ายต่อการเริ่มเขียนโปรแกรม เนื่องจากจะมีการแปลความหมาย คุณไม่จำเป็นต้องคอมไพล์สคริปต์ ทันทีที่คุณแก้ไขไฟล์สคริปต์และทำให้สามารถเรียกใช้งานได้ คุณจะสามารถเรียกใช้ได้ สิ่งนี้ทำให้รอบการเข้ารหัส รัน และดีบักค่อนข้างมีประสิทธิภาพ

มีข้อร้องเรียนหลักสองประการที่ผู้คนมีกับสคริปต์ Bash และประการแรกคือความเร็ว เนื่องจากเปลือก Bash ตีความคำสั่งในสคริปต์ คำสั่งจึงไม่ดำเนินการเร็วเท่ากับโค้ดที่คอมไพล์ อย่างไรก็ตาม มันก็เหมือนกับการบ่นว่ารถแทรกเตอร์ไม่เร็วเท่ารถ พวกมันมีไว้สำหรับสิ่งต่าง ๆ

มีความเร็วสองประเภทแม้ว่า คุณมักจะใช้สคริปต์ด่วนเพื่อทำงานให้เสร็จได้เร็วกว่าการพัฒนาโซลูชันในภาษาที่คอมไพล์ เช่น C

ข้อร้องเรียนที่สองที่ผู้คนมีกับสคริปต์ Bash คืออินเทอร์เฟซผู้ใช้ ซึ่งเป็นหน้าต่างเทอร์มินัล แน่นอน บางครั้งอินเทอร์เฟซก็ไม่สำคัญ หากบุคคลเดียวที่เคยใช้สคริปต์คือผู้เขียน อินเทอร์เฟซอาจไม่สำคัญขนาดนั้น และไม่สำคัญสำหรับสคริปต์ที่ทำการประมวลผลพื้นหลังและประเภทแบทช์ โดยปกติ สคริปต์ดังกล่าวไม่ต้องการการโต้ตอบกับผู้ใช้มากนัก (ถ้ามี)

โฆษณา

มีบางครั้งที่คุณต้องการบางสิ่งที่ใช้งานง่ายและทันสมัยกว่าหน้าต่างเทอร์มินัล คนส่วนใหญ่คุ้นเคยกับอินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) เพื่อให้ผู้คนได้รับประสบการณ์ที่ราบรื่นที่สุด คุณต้องสร้างและใช้องค์ประกอบ GUI จากสคริปต์ของคุณ

แอปพลิเคชั่น zenity

zenity ช่วยให้คุณสามารถรวมองค์ประกอบส่วนต่อประสานกราฟิกที่หลากหลายในสคริปต์ทุบตีของคุณ เป็นชุดเครื่องมืออันทรงพลังที่ช่วยให้สคริปต์ของคุณมีความรู้สึกสมัยใหม่และรูปลักษณ์ร่วมสมัยที่คุ้นเคย

zenity ได้รับการติดตั้งไว้ล่วงหน้าบน Ubuntu, Fedora และ Manjaro distributions เป็นส่วนหนึ่งของ GNOME หากคุณใช้ KDE คุณอาจต้องการลองใช้ kdialog แทน แม้ว่า zenity จะทำงานบนสภาพแวดล้อมเดสก์ท็อปก็ตาม

ตัวอย่างในบทความนี้แสดงวิธีสร้างหน้าต่างโต้ตอบต่างๆ จากบรรทัดคำสั่ง วิธีบันทึกค่าที่ส่งกลับและการเลือกของผู้ใช้ในตัวแปร และวิธีใช้หน้าต่างโต้ตอบในสคริปต์

ปิดท้ายด้วยแอปพลิเคชั่นขนาดเล็กที่ใช้หน้าต่างโต้ตอบทั้งสามประเภท

หน้าต่างโต้ตอบปฏิทิน

หน้าต่างโต้ตอบปฏิทินช่วยให้ผู้อื่นเลือกวันที่ได้ ในการสร้างด้วย zenity ต้องใช้คำสั่งเดียวสองคำ:

 zenity -- ปฏิทิน 
โฆษณา

หน้าต่างโต้ตอบปฏิทินจะปรากฏขึ้น มีฟังก์ชันทั้งหมดที่คุณคาดหวังจากตัวเลือกวันที่มาตรฐาน คุณสามารถเปลี่ยนเดือนและปี และคลิกที่วันเพื่อเลือกวันที่นั้น ตามค่าเริ่มต้น วันที่ของวันนี้จะถูกเน้นเมื่อหน้าต่างปรากฏขึ้น

หน้าต่างปฏิทิน zenity กรกฎาคม 2019

คลิก "ตกลง" เพื่อปิดหน้าต่างโต้ตอบและเลือกวันที่ที่ไฮไลต์ การดับเบิลคลิกที่วันที่จะทำสิ่งเดียวกัน

หากคุณไม่ต้องการเลือกวันที่ ให้คลิก "ยกเลิก" กดปุ่ม "Esc" บนแป้นพิมพ์ของคุณ หรือปิดหน้าต่างโต้ตอบ

หน้าต่างปฏิทิน zenity ที่เลือก 19 สิงหาคม 2019

ในตัวอย่างด้านบน 19 สิงหาคม 2019 ถูกเลือก หากผู้ใช้คลิก "ตกลง" ปฏิทินจะปิดลง และวันที่ที่เลือกจะพิมพ์ออกมาในหน้าต่างเทอร์มินัล

วันที่ที่เลือกในปฏิทิน (08/19/2019) ที่แสดงในหน้าต่างเทอร์มินัล

คุณสามารถละเว้นบรรทัด “GTKDialog ที่แมปโดยไม่มีพาเรนต์ชั่วคราว นี่ท้อแท้”

GTK ย่อมาจาก GIMP Tool Kit ซึ่งเป็นชุดเครื่องมือที่ใช้ในการพัฒนาอินเทอร์เฟซ GNOME เดิมทีมันถูกคิดค้นโดยผู้เขียน GNU Image Manipulation Program (GIMP) GNU ย่อมาจาก Not Unix ของ GNU

โฆษณา

เครื่องยนต์ GTK กำลังเตือนผู้เขียนถึงความ zenity ว่าพวกเขาได้ใช้ส่วนประกอบ GTK ในลักษณะที่ไม่เป็นไปตามมาตรฐาน

จับค่าวันที่

การพิมพ์วันที่ไปยังเครื่องอ่านบัตรไม่ได้ช่วยอะไรเรามากนัก หากเราจะเรียกปฏิทินนี้จากสคริปต์ของเรา เราจำเป็นต้องบันทึกค่าวันที่ที่เลือกไว้ เพื่อที่เราจะสามารถทำสิ่งที่มีประโยชน์ในสคริปต์ของเราได้ เราจะปรับแต่งปฏิทินเล็กน้อยด้วย

เราจะใช้ตัวเลือกต่อไปนี้กับปฏิทิน ต้องใช้ร่วมกับแฟล็ก “–” แบบดับเบิ้ลแดช:

  • –text : ระบุสตริงข้อความที่จะแสดงในปฏิทิน แทนที่ค่าเริ่มต้น "เลือกวันที่จากด้านล่าง"
  • –title : ตั้งชื่อของหน้าต่างโต้ตอบปฏิทิน
  • –day : ตั้งค่าวันที่เลือกเมื่อเปิดปฏิทิน
  • เดือน : ตั้งค่าเดือนที่เลือกเมื่อเปิดปฏิทิน
  • –year : ตั้งค่าปีที่เลือกเมื่อเปิดปฏิทิน

เรากำลังใช้ตัวแปรที่เรียกว่า ChosenDate เพื่อบันทึกวันที่ที่ส่งคืนจากปฏิทิน และเรากำลังใช้ echo $ChosenDate เพื่อพิมพ์วันที่นั้นไปที่หน้าต่างเทอร์มินัล

ใช่ เราได้ผลลัพธ์แบบเดียวกันในตัวอย่างก่อนหน้านี้ แต่ที่นี่ เราได้เก็บวันที่ที่เลือกไว้ในตัวแปร ในตัวอย่างก่อนหน้านี้ มันถูกพิมพ์และลืมไป

 ChosenDate=$(zenity -- ปฏิทิน -- ข้อความ "เลือกวันที่" -- หัวข้อ "How-To Geek Rota" -- วันที่ 1 -- เดือน 9 -- ปี 2019); echo $ChosenDate 

ตอนนี้ ปฏิทินจะแสดงข้อความแจ้งและชื่อหน้าต่างของเรา วันที่ถูกกำหนดเป็นวันที่เริ่มต้นที่เราเลือกแทนที่จะเป็นวันที่ของวันนี้

ปฏิทิน zenity พร้อมวันที่เริ่มต้นที่เลือกไว้ (1 กันยายน 2019)

โฆษณา

เรายังปรับแต่งรูปแบบของสตริงวันที่ที่ส่งคืนเมื่อมีการเลือกได้อีกด้วย ตัวเลือก --date-format ต้องตามด้วยตัวระบุรูปแบบ นี่คือสตริงของโทเค็นที่กำหนดข้อมูลและรูปแบบที่จะรวมอยู่ในเอาต์พุต โทเค็นจะเหมือนกับที่ใช้กับฟังก์ชันภาษาซี strftime() และมีให้เลือกมากมาย

โทเค็นที่เราใช้คือ:

  • %A : ชื่อเต็มของวันในสัปดาห์
  • %d : วันของเดือนเป็นตัวเลข
  • %m : เดือนเป็นตัวเลข
  • %y : ปีเป็นตัวเลขสองหลัก (ไม่มีศตวรรษ)
 ChosenDate=$(zenity -- ปฏิทิน --text "เลือกวันที่" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 -- เดือนที่ 9 --ปี 2019); echo $ChosenDate 

มีคนเลือกวันที่:

หน้าต่างปฏิทิน zenity ที่เลือกวันที่ 16 กันยายน 2019

และวันที่จะถูกส่งกลับโดยใช้รูปแบบของเรา แสดงชื่อวันในสัปดาห์ ตามด้วยวันที่ในลำดับยุโรป ได้แก่ วัน เดือน ปี

หน้าต่างไดอะล็อกการเลือกไฟล์: การเลือกไฟล์

หน้าต่างโต้ตอบการเลือกไฟล์ค่อนข้างซับซ้อน ผู้ใช้สามารถเรียกดูผ่านระบบไฟล์ ไฮไลต์ไฟล์หรือไฟล์ จากนั้นคลิก "ตกลง" เพื่อเลือกไฟล์เหล่านั้นหรือยกเลิกการเลือกทั้งหมด

zenity มีฟังก์ชันทั้งหมดนี้และอีกมากมาย และใช้งานง่ายพอๆ กับหน้าต่างโต้ตอบของปฏิทิน

ตัวเลือกใหม่ที่เราจะใช้คือ:

  • –file-selection : บอก zenity ว่าเราต้องการใช้หน้าต่างโต้ตอบการเลือกไฟล์
  • –multiple : อนุญาตให้บางคนเลือกไฟล์มากกว่าหนึ่งไฟล์
  • –file-filter : บอกหน้าต่างโต้ตอบไฟล์ว่าจะแสดงประเภทไฟล์ใด
 zenity --file-selection --tile "How-To Geek" --multiple --file-filter='*.mm *.png *.page *.sh *.txt' 

หน้าต่างโต้ตอบการเลือกไฟล์ทำงานเหมือนกับหน้าต่างการเลือกไฟล์อื่นๆ

หน้าต่างโต้ตอบส่วนไฟล์ zenity พร้อมโฟลเดอร์ที่เลือก

ผู้ใช้สามารถเรียกดูระบบไฟล์และเลือกไฟล์ที่ต้องการได้

หน้าต่างโต้ตอบการเลือกไฟล์ zenity พร้อมไฟล์ที่เลือก

โฆษณา

เราได้เรียกดูไดเรกทอรีใหม่และเลือกไฟล์ชื่อ “button_hybrid.png”

เมื่อคุณคลิก "ตกลง" หน้าต่างโต้ตอบการเลือกไฟล์จะปิดลง และชื่อไฟล์และเส้นทางจะพิมพ์ในหน้าต่างเทอร์มินัล

หากคุณต้องการใช้ชื่อไฟล์ในการประมวลผลใดๆ เพิ่มเติม คุณสามารถบันทึกชื่อไฟล์นั้นในตัวแปรได้ เช่นเดียวกับที่คุณทำกับวันที่ในปฏิทิน

หน้าต่างไดอะล็อกการเลือกไฟล์: การบันทึกไฟล์

ถ้าเราเพิ่มหนึ่งตัวเลือก เราสามารถเปลี่ยนหน้าต่างโต้ตอบการเลือกไฟล์เป็นหน้าต่างโต้ตอบบันทึกไฟล์ได้ ตัวเลือกคือ --save เราจะใช้ตัวเลือก --confirm-overwrite ซึ่งจะแจ้งให้บุคคลนั้นยืนยันว่าต้องการเขียนทับไฟล์ที่มีอยู่

 ตอบกลับ=$(zenity --file-selection --save --confirm-overwrite); echo $Response 

หน้าต่างโต้ตอบการบันทึกไฟล์จะปรากฏขึ้น โปรดทราบว่ามีฟิลด์ข้อความที่ผู้อื่นสามารถพิมพ์ชื่อไฟล์ได้

หน้าต่างโต้ตอบบันทึกไฟล์ zenity

ผู้ใช้สามารถเรียกดูตำแหน่งที่ต้องการได้ภายในระบบไฟล์ ระบุชื่อไฟล์ หรือคลิกไฟล์ที่มีอยู่เพื่อเขียนทับ

กล่องโต้ตอบบันทึกไฟล์ zenity โดยเลือกไฟล์ที่มีอยู่แล้ว

โฆษณา

ในตัวอย่างข้างต้น ผู้ใช้ไฮไลต์ไฟล์ที่มีอยู่

เมื่อเขาคลิก "ตกลง" หน้าต่างโต้ตอบการยืนยันจะปรากฏขึ้นเพื่อขอให้เขายืนยันว่าต้องการแทนที่ไฟล์ที่มีอยู่ สังเกตว่าชื่อไฟล์ปรากฏในไดอะล็อกคำเตือน นั่นคือความใส่ใจในรายละเอียดที่ทำให้ zenity เป็นมืออาชีพ

ถ้าเราไม่ได้ใช้ --confirm-overwrite ตัวเลือก ไฟล์จะถูกเขียนทับโดยไม่โต้ตอบ

กล่องโต้ตอบการยืนยันการเขียนทับ zenity

ชื่อของไฟล์ถูกเก็บไว้ในตัวแปร Response ซึ่งพิมพ์ไปที่หน้าต่างเทอร์มินัล

หน้าต่างโต้ตอบการแจ้งเตือน

ด้วย zenity รวมถึงหน้าต่างโต้ตอบการแจ้งเตือนที่ลื่นไหลในสคริปต์ของคุณนั้นทำได้อย่างง่ายดาย มีหน้าต่างโต้ตอบหุ้นที่คุณสามารถเรียกใช้เพื่อให้ข้อมูล คำเตือน ข้อความแสดงข้อผิดพลาด และคำถามสำหรับผู้ใช้

ในการสร้างหน้าต่างข้อความแสดงข้อผิดพลาด ให้ใช้คำสั่งต่อไปนี้:

 zenity --error --width 300 --text "การอนุญาตถูกปฏิเสธ ไม่สามารถเขียนไปยังไฟล์ได้"

ตัวเลือกใหม่ที่เราใช้คือ:

  • –error : บอก zenity ว่าเราต้องการใช้หน้าต่างโต้ตอบข้อผิดพลาด
  • –width : ตั้งค่าความกว้างเริ่มต้นของหน้าต่าง

โฆษณา

หน้าต่างข้อความแสดงข้อผิดพลาดปรากฏขึ้นที่ความกว้างที่ระบุ ใช้ไอคอนข้อผิดพลาด GTK มาตรฐาน

หน้าต่างโต้ตอบข้อผิดพลาด zenity

ในการสร้างหน้าต่างโต้ตอบข้อมูล ให้ใช้คำสั่งต่อไปนี้:

 zenity --info --width 300 --text "อัปเดตเสร็จสมบูรณ์ คลิกตกลงเพื่อดำเนินการต่อ"

ตัวเลือกใหม่ที่เราใช้คือ --info ซึ่งบอกให้ zenity สร้างหน้าต่างโต้ตอบข้อมูล

หน้าต่างโต้ตอบข้อมูล zenity

ในการสร้างหน้าต่างโต้ตอบคำถาม ให้ใช้คำสั่งต่อไปนี้:

 zenity --question --width 300 --text "คุณยินดีที่จะดำเนินการต่อหรือไม่"; เสียงสะท้อน $?

ตัวเลือกใหม่ที่เราใช้คือ --question ซึ่งบอกให้ zenity สร้างหน้าต่างโต้ตอบคำถาม

$? เป็นพารามิเตอร์พิเศษ เก็บค่าส่งคืนจากไปป์ไลน์ที่เรียกใช้งานล่าสุด โดยทั่วไป นี่คือค่าจากกระบวนการที่ปิดล่าสุด ค่าศูนย์หมายถึง "ตกลง" และค่าอย่างน้อยหนึ่งค่าหมายถึง "ยกเลิก"

โฆษณา

นี่เป็นเทคนิคทั่วไปที่คุณสามารถนำไปใช้กับหน้าต่างไดอะล็อก zenity ใดก็ได้ โดยการตรวจสอบค่านี้ในสคริปต์ของคุณ คุณสามารถกำหนดได้ว่าข้อมูลที่ส่งคืนจากหน้าต่างโต้ตอบควรได้รับการประมวลผลหรือละเว้น

กล่องโต้ตอบคำถาม zenity

เราคลิก "ใช่" ดังนั้นรหัสส่งคืนจึงเป็นศูนย์ที่ระบุว่า "ตกลง"

ในการสร้างหน้าต่างโต้ตอบคำเตือน ให้ใช้คำสั่งต่อไปนี้:

 zenity --warning --title "Low Hard Drive Space" --width 300 --text "อาจมีเนื้อที่ฮาร์ดไดรฟ์ไม่เพียงพอที่จะบันทึกข้อมูลสำรอง"

ตัวเลือกใหม่ที่เราใช้คือ --warning ซึ่งบอกให้ zenity สร้างหน้าต่างโต้ตอบคำเตือน

หน้าต่างโต้ตอบคำเตือนจะปรากฏขึ้น ไม่ใช่คำถาม จึงมีปุ่มเดียวเท่านั้น

หน้าต่างโต้ตอบคำเตือน zenity

หน้าต่างโต้ตอบความคืบหน้า

คุณสามารถใช้หน้าต่างโต้ตอบความคืบหน้าของ zenity เพื่อแสดงแถบความคืบหน้าที่ระบุว่าสคริปต์ของคุณใกล้จะเสร็จสมบูรณ์เพียงใด

โฆษณา

แถบความคืบหน้าเป็นขั้นสูงตามค่าที่ได้รับจากสคริปต์ของคุณ เพื่อแสดงหลักการให้ใช้คำสั่งต่อไปนี้:

 (สำหรับ i ใน $(seq 0 10 100); do echo $i; sleep 1; done) 

คำสั่งแบ่งดังนี้:

  • คำสั่ง seq ดำเนินการตามลำดับตั้งแต่ 0 ถึง 100 ในขั้นตอนที่ 10
  • ในแต่ละขั้นตอน ค่าจะถูกเก็บไว้ในตัวแปร i สิ่งนี้จะพิมพ์ไปที่หน้าต่างเทอร์มินัล
  • คำสั่งหยุดเป็นเวลาหนึ่งวินาที เนื่องจากคำสั่ง sleep 1

เราสามารถใช้สิ่งนี้กับหน้าต่างโต้ตอบความคืบหน้าของ zenity เพื่อแสดงแถบความคืบหน้า โปรดทราบว่าเรากำลังส่งผลลัพธ์ของคำสั่งก่อนหน้าเป็น zenity:

 (สำหรับฉันใน $(seq 0 10 100); do echo $i; sleep 1; done) | zenity -- ความคืบหน้า -- หัวข้อ "How-To Geek" -- ปิดอัตโนมัติ 

ตัวเลือกใหม่ที่เราใช้คือ:

  • –progress : บอก zenity ว่าเราต้องการใช้หน้าต่างโต้ตอบความคืบหน้า
  • –auto-close : ปิดกล่องโต้ตอบเมื่อแถบความคืบหน้าถึง 100 เปอร์เซ็นต์

หน้าต่างข้อความแสดงความคืบหน้าจะปรากฏขึ้น และแถบเลื่อนไปข้างหน้าถึง 100 เปอร์เซ็นต์ โดยจะหยุดระหว่างแต่ละขั้นตอนเป็นเวลาหนึ่งวินาที

กล่องโต้ตอบความคืบหน้า zenity

เราสามารถใช้แนวคิดของการไพพ์ค่าลงใน zenity เพื่อรวมหน้าต่างโต้ตอบความคืบหน้าในสคริปต์

ป้อนข้อความนี้ในตัวแก้ไขและบันทึกเป็น “progress.sh”

 !/bin/bash

ฟังก์ชั่นรายการงาน () {

echo "# ผลงานชิ้นแรก" 
เสียงสะท้อน "25"
นอน 1

echo "# ไอเท็มงานที่สอง" 
เสียงสะท้อน "50"
นอน 1

echo "# รายการงานที่สาม" 
เสียงสะท้อน "75"
นอน 1

echo "# รายการงานสุดท้าย" 
เสียงสะท้อน "100"
นอน 1

}

รายการงาน | zenity --progress --title "How-To Geek" --auto-close

ทางออก 0

นี่คือรายละเอียดของสคริปต์:

  • สคริปต์กำหนดฟังก์ชันที่เรียกว่า work-list งาน นี่คือที่ที่คุณใส่คำสั่งและคำแนะนำในการทำงานจริง แทนที่คำสั่ง sleep 1 แต่ละคำสั่งด้วยคำสั่งจริงของคุณ
  • zenity ยอมรับบรรทัด echo "# ..." และแสดงในหน้าต่างโต้ตอบความคืบหน้า เปลี่ยนข้อความของบรรทัดเหล่านี้ เพื่อส่งข้อความข้อมูลไปยังผู้ใช้
  • เส้น echo ที่มีตัวเลข เช่น echo "25" ได้รับการยอมรับจาก zenity และตั้งค่าแถบความคืบหน้าด้วย
  • ฟังก์ชันรายการงานถูกเรียกและวางลงใน zenity

ใช้คำสั่งนี้เพื่อทำให้สคริปต์ทำงานได้:

 chmod +x ความคืบหน้า.sh 

ใช้คำสั่งนี้เพื่อเรียกใช้สคริปต์:

 ./progress.sh 

สคริปต์ทำงาน และข้อความจะเปลี่ยนไปตามแต่ละเฟสของสคริปต์ดำเนินการ แถบความคืบหน้าจะเคลื่อนที่เป็นขั้นๆ ไปที่ 100 เปอร์เซ็นต์

หน้าต่างโต้ตอบแถบความคืบหน้าของ zenity

หน้าต่างโต้ตอบมาตราส่วน

หน้าต่างโต้ตอบมาตราส่วนช่วยให้ผู้อื่นเลื่อนแถบเลื่อนเพื่อเลือกค่าตัวเลขได้ ซึ่งหมายความว่าเธอไม่สามารถป้อนค่าที่สูงหรือต่ำเกินไป

ตัวเลือกใหม่ที่เราใช้คือ:

  • –scale : บอก zenity ว่าเราต้องการใช้หน้าต่างโต้ตอบมาตราส่วน
  • –min-value : ตั้งค่าต่ำสุดสำหรับมาตราส่วน
  • –max-value : ตั้งค่าสูงสุดสำหรับมาตราส่วน
  • ขั้นตอน : ตั้งค่าจำนวนที่ตัวเลื่อนจะเคลื่อนเข้ามาเมื่อใช้ปุ่มลูกศร การดำเนินการนี้จะไม่ส่งผลต่อการเคลื่อนไหวของตัวเลื่อนหากมีคนใช้เมาส์
  • –value : ตั้งค่าเริ่มต้นและตำแหน่งของตัวเลื่อน

นี่คือคำสั่งที่เราใช้:

 Response=$(zenity --scale --title "How-To Geek" --text "Selectการขยาย" --min-value=0 --max-value=30 --step=3 --value15); echo $Response 

โฆษณา

หน้าต่างโต้ตอบของตัวเลื่อนจะปรากฏขึ้นโดยตั้งค่าตัวเลื่อนเป็น 15

หน้าต่างโต้ตอบมาตราส่วน zenity

ผู้ใช้สามารถเลื่อนแถบเลื่อนเพื่อเลือกค่าใหม่

กล่องโต้ตอบมาตราส่วน zenity พร้อมการเลือกผู้ใช้

เมื่อเธอคลิก "ตกลง" ค่าจะถูกโอนไปยังตัวแปร Response และพิมพ์ไปยังหน้าต่างเทอร์มินัล

หน้าต่างโต้ตอบรายการ

หน้าต่างโต้ตอบรายการช่วยให้ผู้อื่นป้อนข้อความได้

ตัวเลือกใหม่ที่เราใช้คือ:

  • –entry : บอก zenity ว่าเราต้องการใช้หน้าต่างโต้ตอบรายการ
  • –entry-text : คุณสามารถใช้ได้หากต้องการพิมพ์ค่าที่แนะนำในช่องป้อนข้อความ เรากำลังใช้ “” เพื่อบังคับให้มีช่องว่าง ไม่จำเป็นอย่างยิ่ง แต่เราต้องการบันทึกตัวเลือกนี้

คำสั่งแบบเต็มมีลักษณะดังนี้:

 Response=$(zenity --entry --text "ป้อนคำค้นหาของคุณ" --title "Howe-To Geek" --entry-text=""); echo $Response 

หน้าต่างโต้ตอบแบบง่ายจะปรากฏขึ้น โดยมีฟิลด์ป้อนข้อความ

หน้าต่างโต้ตอบรายการ zenity

บุคคลอื่นสามารถพิมพ์และแก้ไขข้อความได้

หน้าต่างโต้ตอบรายการ zenity พร้อมข้อความที่พิมพ์ในช่องข้อความ

เมื่อเขาคลิก "ตกลง" ค่าที่เขาพิมพ์จะถูกกำหนดให้กับตัวแปร Response เราใช้ echo เพื่อพิมพ์ค่าของตัวแปรในหน้าต่างเทอร์มินัล

วางมันทั้งหมดเข้าด้วยกัน

มารวมเทคนิคเหล่านี้เข้าด้วยกันและสร้างสคริปต์การทำงานกัน สคริปต์จะทำการสแกนข้อมูลฮาร์ดแวร์และนำเสนอผลลัพธ์แก่ผู้ใช้ในหน้าต่างข้อความแบบเลื่อน เธอสามารถเลือกประเภทการสแกนแบบยาวหรือแบบสั้นได้

โฆษณา

สำหรับสคริปต์นี้ เราจะใช้หน้าต่างโต้ตอบสามประเภท ซึ่งสองประเภทเป็นหน้าต่างใหม่สำหรับเรา:

  • อย่างแรกคือหน้าต่างโต้ตอบรายการ จะช่วยให้ใครสักคนเลือกได้
  • อย่างที่สองคือหน้าต่างโต้ตอบความคืบหน้าที่แจ้งให้ผู้ใช้ทราบว่ามีบางอย่างกำลังเกิดขึ้น และเธอควรรอ
  • ที่สามคือหน้าต่างข้อมูลข้อความซึ่งแสดงผลให้กับผู้ใช้

ป้อนข้อความนี้ในตัวแก้ไขและบันทึกเป็น “hardware-info.sh”

 #!/bin/bash

# แสดงรายการฮาร์ดแวร์สำหรับคอมพิวเตอร์เครื่องนี้

TempFile=$(mktemp)

ListType=`zenity --width=400 --height=275 --list --radiolist \
     --title 'การสแกนฮาร์ดแวร์' \
     --text 'เลือกประเภทการสแกน:' \
     --column 'เลือก' \
     --column 'ประเภทการสแกน' TRUE "Short" FALSE "Long"`

ถ้า [[ $? -eq 1 ]]; แล้ว

  # พวกเขากดยกเลิกหรือปิดหน้าต่างโต้ตอบ 
  zenity --error --title="สแกนถูกปฏิเสธ" --width=200 \
       --text="ข้ามการสแกนฮาร์ดแวร์"
  ทางออก 1
 
elif [ $ListType == "สั้น" ]; แล้ว

  # พวกเขาเลือกปุ่มตัวเลือกสั้น ๆ 
  ธง="--สั้น"
 
อื่น

  # พวกเขาเลือกปุ่มตัวเลือกแบบยาว 
  ธง="" 
fi

# ค้นหาข้อมูลฮาร์ดแวร์ด้วยค่าที่เหมาะสมใน $Flag
hwinfo $Flag | ที >(zenity --width=200 --height=100\
     --title="การเรียงข้อมูล" --ความคืบหน้า \
     --pulsate --text="กำลังตรวจสอบฮาร์ดแวร์..." \
     --auto-kill --auto-close) >${TempFile}
 
# แสดงข้อมูลฮาร์ดแวร์ในหน้าต่างเลื่อน
zenity --width=800 --height=600 \
     --title "รายละเอียดฮาร์ดแวร์" \
     --text-info --filename="${TempFile}"
 
ทางออก 0

ใช้คำสั่งนี้เพื่อทำให้สามารถเรียกใช้งานได้:

 chmod +x hardware-info.sh 

"chmod +x haredware-info.sh ในหน้าต่างเทอร์มินัล"

สคริปต์นี้สร้างไฟล์ชั่วคราว และชื่อของไฟล์ถูกเก็บไว้ในตัวแปร TempFile:

 TempFile=$(mktemp)

สคริปต์ใช้ตัวเลือก --list เพื่อสร้างหน้าต่างโต้ตอบ zenity ที่เรียกว่าหน้าต่างโต้ตอบรายการ อักขระ "\" ที่ท้ายบรรทัดบอกให้สคริปต์ปฏิบัติต่อพวกเขาเหมือนบรรทัดยาวหนึ่งบรรทัดที่ล้อมรอบ นี่คือกระบวนการ:

  • เราระบุความกว้างและความสูงของหน้าต่าง
  • หน้าต่างโต้ตอบรายการรองรับคอลัมน์ ตัวเลือก --radiolist ทำให้คอลัมน์แรกเป็นคอลัมน์ของปุ่มตัวเลือก
  • เราตั้งชื่อและข้อความแจ้งสำหรับหน้าต่าง
  • เราตั้งชื่อคอลัมน์แรกเป็น "เลือก" เนื้อหาของคอลัมน์นี้จะเป็นปุ่มตัวเลือก
  • เราตั้งชื่อคอลัมน์ที่สองเป็น "เลือก" และเราให้เนื้อหาของคอลัมน์ที่สอง คอลัมน์นี้มีป้ายกำกับข้อความสองป้าย: "สั้น" และ "ยาว" ตัวบ่งชี้ TRUE และ FALSE หมายถึงตัวเลือก "Short" ถูกเลือกโดยค่าเริ่มต้นเมื่อหน้าต่างโต้ตอบปรากฏขึ้น
  • เรากำลังจัดเก็บผลลัพธ์จากหน้าต่างโต้ตอบนี้ในตัวแปรชื่อ ListType
 ListType=`zenity --width=400 --height=275 --list --radiolist \ 
     --title 'การสแกนฮาร์ดแวร์' \ 
     --text 'เลือกประเภทการสแกน:' \ 
     --column 'เลือก' \ 
     --column 'ประเภทการสแกน' TRUE "Short" FALSE "Long"`

หากผู้ใช้กด "ยกเลิก" เราไม่จำเป็นต้องตรวจสอบค่าใน ListType, เราก็สามารถออกได้ ถ้าเขากด "ตกลง" เราจำเป็นต้องค้นหาว่าเขาเลือกปุ่มตัวเลือก "สั้น" หรือ "ยาว" หรือไม่:

  • พารามิเตอร์พิเศษ $? เท่ากับศูนย์หากผู้ใช้กด "ตกลง" เท่ากับหนึ่งถ้าเขากด "ยกเลิก" หรือปิดหน้าต่าง
  • หากมีค่าเท่ากับหนึ่ง สคริปต์จะแสดงหน้าต่างโต้ตอบข้อมูลข้อผิดพลาดและออก ถ้าเขากด "ตกลง" เราจะไปทดสอบค่าในตัวแปร ListType
  • หากตัวแปร ListType มีค่าเป็น "Short" สคริปต์จะตั้งค่าตัวแปรที่เรียกว่า Flag ให้เท่ากับ "–short"
  • หากตัวแปร ListType ไม่มีค่า "Short" จะต้องเก็บค่า "Long" สคริปต์ตั้งค่าตัวแปรที่เรียกว่า Flag กให้เท่ากับ “” ซึ่งเป็นสตริงว่าง
  • สคริปต์ใช้ตัวแปร Flag ล็กในส่วนถัดไป
 ถ้า [[ $? -eq 1 ]]; แล้ว 

  # พวกเขากดยกเลิกหรือปิดหน้าต่างโต้ตอบ 
  zenity --error --title="สแกนถูกปฏิเสธ" --width=200 \ --text="ข้ามการสแกนฮาร์ดแวร์" 
  ทางออก 1 

elif [ $ListType == "สั้น" ]; แล้ว 

 # พวกเขาเลือกปุ่มตัวเลือกสั้น ๆ 
 ธง="--สั้น" 

อื่น 

 # พวกเขาเลือกปุ่มตัวเลือกแบบยาว 
 ธง="" 
fi
โฆษณา

เมื่อสคริปต์รู้ว่าผู้ใช้ต้องการสแกนประเภทใด เราก็สามารถทำการสแกนข้อมูลฮาร์ดแวร์ได้:

  • สคริปต์เรียกคำสั่ง hwinfo และส่งผ่านค่าในตัวแปร Flag ล็ก
  • หาก Flag ล็กมี “–short” คำสั่ง hwinfo ทำการสแกนสั้นๆ หากค่าของ Flag ล็กคือ “” จะไม่มีสิ่งใดส่งผ่านไปยัง hwinfo และค่าเริ่มต้น การสแกนแบบยาวจะดำเนินการ
  • สคริปต์ไพพ์เอาต์พุตจาก hwinfo ลงใน tee tee ส่งเอาต์พุตไปที่ zenity และ TempFile
  • สคริปต์สร้างหน้าต่างโต้ตอบแถบความคืบหน้า มันกำหนดความกว้างและความสูงของหน้าต่างโต้ตอบ และชื่อเรื่องและข้อความพร้อมท์
  • สคริปต์ไม่สามารถทราบล่วงหน้าว่าคำสั่ง hwinfo จะสร้างข้อมูลได้มากน้อยเพียงใด ดังนั้นจึงไม่สามารถตั้งค่าแถบความคืบหน้าให้ก้าวหน้าอย่างถูกต้องถึง 100 เปอร์เซ็นต์ ตัวเลือก --pulsate ทำให้กล่องโต้ตอบความคืบหน้าแสดงตัวบ่งชี้ที่เคลื่อนไหว สิ่งนี้จะแจ้งให้ผู้ใช้ทราบว่ามีบางอย่างเกิดขึ้น และเขาควรรอ
  • ตัวเลือก --auto-kill จะยุติสคริปต์หากมีผู้คลิก "ยกเลิก"
  • ตัวเลือก --auto-close ทำให้กล่องโต้ตอบความคืบหน้าปิดโดยอัตโนมัติเมื่อกระบวนการตรวจสอบเสร็จสิ้น
 # ค้นหาข้อมูลฮาร์ดแวร์ด้วยค่าที่เหมาะสมใน $Flag
hwinfo $Flag | ที >(zenity --width=200 --height=100\
     --title="การเรียงข้อมูล" --ความคืบหน้า \
     --pulsate --text="กำลังตรวจสอบฮาร์ดแวร์..." \
     --auto-kill --auto-close) >${TempFile}

เมื่อการสแกน hwinfo เสร็จสิ้น สคริปต์จะเรียก zenity เพื่อสร้างหน้าต่างโต้ตอบข้อมูลข้อความด้วยตัวเลือก --text-info หน้าต่างโต้ตอบข้อมูลข้อความจะแสดงเนื้อหาของไฟล์ TempFile :

  • สคริปต์กำหนดความกว้างและความสูงของหน้าต่างโต้ตอบและข้อความชื่อเรื่อง
  • ตัวเลือก --flename ใช้เพื่ออ่านเนื้อหาของไฟล์ที่อยู่ในตัวแปร TempFIle
 # แสดงข้อมูลฮาร์ดแวร์ในหน้าต่างเลื่อน 
zenity --width=800 --height=600 \ 
     --title "รายละเอียดฮาร์ดแวร์" \ 
     --text-info --filename="${TempFile}"

เมื่อผู้ใช้ปิดหน้าต่างโต้ตอบข้อมูลข้อความ สคริปต์จะออก

 ทางออก 0

มาเปิดไฟกันดูเลย

 ./hardware-info.sh 

กล่องรายการจะปรากฏขึ้น ตัวเลือก "สั้น" ถูกเลือกไว้โดยค่าเริ่มต้น

กล่องโต้ตอบรายการโดยเลือกตัวเลือก "สั้น"

ให้เลือก "Long" แล้วคลิก "OK"

กล่องโต้ตอบรายการโดยเลือกตัวเลือก "ยาว"

หน้าต่างความคืบหน้าจะปรากฏขึ้นพร้อมกับตัวระบุแบบเลื่อน มันยังคงอยู่บนหน้าจอจนกว่าการสแกนฮาร์ดแวร์จะเสร็จสิ้น

หน้าต่างความคืบหน้าพร้อมตัวบ่งชี้การเลื่อน

เมื่อการสแกนฮาร์ดแวร์เสร็จสิ้น หน้าต่างข้อความแสดงข้อมูลข้อความจะปรากฏขึ้นพร้อมรายละเอียดจากการสแกน

ข้อมูลการสแกนฮาร์ดแวร์ในหน้าต่างข้อความโต้ตอบข้อมูล

คลิก "ตกลง"

โฆษณา

แม้แต่นักจัดรายการบรรทัดคำสั่งที่ตายยากยังต้องยอมรับหน้าต่างโต้ตอบ GUI สองสามหน้าต่างสามารถให้สคริปต์ Bash ที่ต่ำต้อยมีความเป็นมืออาชีพ