วิธีตั้งโปรแกรมไอคอนสถานะที่จะแสดงใน Ubuntu และในดิสทริบิวชันอื่น ๆ


23

แอปพลิเคชันที่เป็นปัญหาจะดำเนินการบางอย่าง (ที่นี่เชื่อมต่อเสียงกับสตรีมเครือข่าย) และทำงานลดลงหากการกระทำเหล่านี้ประสบความสำเร็จ ดังนั้นจำเป็นต้องใช้ไอคอนสถานะเพื่อแสดงสถานะของการเชื่อมต่อ (เช่น CONNECTED / DISCONNECTED) เฉพาะเมื่อคลิกที่ไอคอนหน้าต่างแอปพลิเคชั่นจะเปิดขึ้นเพื่อให้เข้าถึงตัวเลือกเพิ่มเติม

ใช้ Python 2.6 และ PyGTK ผมสิ่งอำนวยความสะดวกตระหนักในเรื่องนี้โดยใช้gtk_status_icon ฉันจงใจเขียนแอปพลิเคชันเพื่อให้ทำงานได้มากที่สุดเท่าที่จะเป็นไปได้รวมถึง Ubuntu รุ่นต่างๆ ฉันดูแลให้ใช้การอ้างอิงที่เป็นไปได้หลังจากผู้ใช้ติดตั้งแล้วเท่านั้น

อย่างไรก็ตามตอนนี้ฉันได้ยินมาว่า gtk_status_icon จะไม่ได้รับการสนับสนุนในรุ่นต่อไปของ Ubuntu นักพัฒนาซอฟต์แวร์จะขอให้ใช้ตัวบ่งชี้แอปพลิเคชันแทน แนวทางปฏิบัติที่ดีที่สุดคืออะไรเพื่อให้แน่ใจว่า:

  1. ไอคอนโลคัลของแอปพลิเคชันแสดงขึ้นอย่างถูกต้อง
  2. แอปพลิเคชั่นจะยังคงทำงานและแสดงไอคอนเป็น Ubuntu รุ่นต่อไปในอนาคต
  3. โปรแกรมจะยังทำงานและแสดงไอคอนของมันในสภาพแวดล้อมอื่น ๆ ที่บ่งชี้แอปเพล็ , libappindicatorและหลาม appindicatorจะไม่ให้

กลไกการย้อนกลับแอปพลิเคชันตัวบ่งชี้ถึง gtk_status_icon จะไม่ทำงานหากตัวบ่งชี้แอปเพล็ตไม่ทำงาน Python interpreters จะไม่ทำงานหากไม่มีโมดูลappindicator ที่จะนำเข้า ฉันจำเป็นต้องพัฒนาเวอร์ชันต่าง ๆ สำหรับการแจกแจงที่แตกต่างกันหรือมีวิธีที่ดีกว่าในการแก้ปัญหานี้

ฉันจะหาเอกสารเกี่ยวกับวิธีการใช้ ApplicationIndicator นอกเหนือจากตัวอย่างที่ให้ในUbuntu Wiki ได้อย่างไร มีคำสั่งอะไรบ้างในการตรวจสอบว่าตัวบ่งชี้ - แอปเพล็ตกำลังทำงานอยู่หรือไม่เพื่อหลีกเลี่ยงการเขียนโปรแกรมซอร์สโค้ดที่แตกต่างกันสำหรับ Ubuntu และการแจกแจงที่ไม่ใช่อูบุนตู?

คำตอบ:


16

ฉันคิดว่าความต้องการที่นี่เป็นจริงการกำหนดมากขึ้นของห้องสมุดหลาม appindicator หากมีอยู่มันจะรองรับเคสสำรองทั้งหมดที่คุณต้องการ มันจะจัดการกับ XFCE, KDE และ GNOME ที่เก่ากว่าอย่างเหมาะสม ตัวอย่างที่ดีของวิธีการทำในคำตอบนี้

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

น่าเสียดายที่ฉันเชื่อว่าคุณจะต้องเก็บโค้ดพา ธ ทั้งสองไว้หากคุณต้องการจัดการกับกรณีของไลบรารี่ที่ไม่สามารถใช้งานได้ ถึงแม้ว่าเราจะมีความสุขที่ได้ช่วยห้องสมุดในสถานที่อื่น ๆ :)


ขอบคุณสำหรับคำตอบที่ชัดเจนมาก สิ่งนี้ชี้ไปยังเส้นทางที่ฉันจะต้องไปถ้าฉันต้องการให้แอปของฉันทำงานใน 11.04 ฉันมีเส้นทางการทำงานสำหรับ GtkStatusIcon แต่จะต้องพัฒนาสิ่งทั้งหมดอีกครั้งสำหรับตัวบ่งชี้แอปเพล็ต ถ้าฉันเข้าใจความคิดเห็นของคุณเพื่อข้อผิดพลาด # 668375 ฉันอาจจะสามารถใช้ไอคอนท้องถิ่นของฉันโดยไม่ต้องสร้างชุดไอคอนทั้งหมดฉันจะได้ไหม?
Takkat

เมื่อมีเวลาดำน้ำในการเขียนโปรแกรม AppIndicator ฉันพบว่าการใช้คำแนะนำของ jgoguen เพื่อตรวจสอบโมดูล appindicator ไม่ได้ช่วยจริงๆเพราะไอคอนที่กำหนดเองจะไม่แสดงผลใน 10.04 LTS ดูความคิดเห็นของฉันเพื่อข้อผิดพลาด # 668375
Takkat

คำตอบของฉันมีวิธีง่าย ๆ ในการแก้ปัญหานี้ มันทำงานได้ดีมากสำหรับแอปของฉันและยังทำให้เจ็บปวดในการพอร์ตแอพที่ใช้ AppIndicators กับ Windows!
นาธานออสมัน

10

ฉันมีโซลูชันที่ยอดเยี่ยมที่ทำงานได้ดีในStackApplet - ฉันสร้างรุ่นที่เทียบเท่ากับการใช้งานของappindicatorโมดูลที่ใช้gtk.StatusIconภายในเพื่อจัดเตรียมการทำงานที่เหมือนกันเมื่อไม่มีโมดูลจริง

การใช้มันง่ายเหมือน:

  1. กำลังดาวน์โหลดไฟล์ต่อไปนี้และเรียกมันappindicator_replacement.py
  2. การเพิ่มสิ่งต่อไปนี้ในแอปพลิเคชันของคุณ:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

แค่นั้นแหละ! ตอนนี้แอปพลิเคชันของคุณจะทำงานได้อย่างสมบูรณ์แบบโดยมีหรือไม่มีการสนับสนุน AppIndicators มันจะทำงานบน Windows โดยสมมติว่าคุณไม่มีรหัสเฉพาะแพลตฟอร์มอื่น ๆ


หมายเหตุ:ไฟล์นี้เผยแพร่ภายใต้ลิขสิทธิ์ของ MIT - ดังนั้นคุณสามารถใช้งานได้กับทุกสิ่ง


9

คุณจะต้องเขียนรหัสสำหรับทั้งสอง คุณสามารถตรวจจับการปรากฏตัวของตัวบ่งชี้ในรหัส Python ของคุณโดยใช้สิ่งที่คล้ายกับ:

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

จากนั้นใช้ have_appindicator เพื่อตัดสินใจว่าคุณควรใช้รหัส appindicator หรือรหัส gtk_status_icon

น่าเสียดายที่นี่หมายความว่าคุณจะต้องมีทั้ง Ubuntu และสภาพแวดล้อมอื่นเพื่อทำการทดสอบ


1
ยังอาจมีสภาพแวดล้อมที่ติดตั้งpython-appindicatorแต่แอปเพล็ตตัวบ่งชี้ไม่ทำงาน แอปพลิเคชันจะต้องจัดการกับเรื่องนี้ด้วย
Takkat

สำหรับกรณีดังกล่าวโปรดดูwiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Custom Fallbacks ตามค่าเริ่มต้นคุณจะได้รับ gtk.StatusIcon สำหรับตัวบ่งชี้แอปพลิเคชันหากไม่มีตัวบ่งชี้แอปเพล็ต
htorque

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

ฉันคิดว่ามันจะตรวจสอบตัวบ่งชี้ - แอปเพล็ตและแสดงฟังก์ชัน gtk_status_icon ที่อยู่เบื้องหลัง
jgoguen

1
@jgoguen: "มัน" คืออะไร? ฉันเข้าใจว่าตั้งแต่ 11.04 Ubuntu / Unity จะไม่รองรับ gtk_status_icon อีกต่อไป การแจกแจงอื่น ๆ อาจไม่มี "มัน" ฉันกังวลเกี่ยวกับเรื่องนี้จริงๆ
Takkat

3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

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


ขอบคุณสำหรับการชี้ไปที่การรับ PID ของตัวบ่งชี้ - แอปเพล็ต (ฉันทำสิ่งนี้เพื่อการพึ่งพาที่เป็นไปได้อื่น ๆ โดยใช้ pidof) นี่จะเป็นวิธีที่สง่างามน้อยลงหากไม่มีสิ่งใดที่ดีกว่า เท่าที่ฉันเห็นตัวบ่งชี้แอปเพล็ทำงานอย่างเชื่อถือได้ด้วยความสามัคคีเฉพาะเมื่อตรงตามข้อกำหนดของฮาร์ดแวร์ ผู้ใช้จะสามารถบูตเข้าสู่ 2D GNOME และสามารถตัดสินใจว่าจะไม่รันตัวบ่งชี้ - แอปเพล็ต อย่างไรก็ตามนี่อาจไม่ใช่ปัญหาของฉันในตอนนั้น
Takkat

ฉันเห็นด้วยกับคุณว่ามันอาจจะไม่ 'หรูหรา' (แต่คุณสามารถเพิ่มเครื่องสำอางทั้งหมดที่คุณต้องการ: D) แต่มันควรจะทำงาน โดยส่วนตัวฉันชอบวิธีแก้ปัญหาที่ใช้งานได้ดีและความสง่างามมาเป็นอันดับสอง :)
OpenNingia

ดูเหมือนว่างานนี้จะไม่ทำงานบนระบบ 14.04 ของฉัน มีวิธีการที่ถูก superceded? มีงานเยอะมาก/usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceแทน
halfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.