Làm cách nào để lập trình một biểu tượng trạng thái sẽ hiển thị trong Ubuntu cũng như trong các bản phân phối khác?


23

Ứng dụng được đề cập thực hiện một số hành động (ở đây kết nối âm thanh với luồng mạng) và chạy tối thiểu hóa nếu những hành động này thành công. Do đó, một biểu tượng trạng thái là cần thiết để hiển thị trạng thái của kết nối (ví dụ: KẾT NỐI / GIẢI QUYẾT). Chỉ khi nhấp vào biểu tượng, cửa sổ ứng dụng sẽ mở để cấp quyền truy cập cho các tùy chọn khác.

Sử dụng Python 2.6 và pyGtk tôi thuận tiện nhận ra điều này bằng cách sử dụng gtk_status_icon . Tôi đã cố tình viết ứng dụng để chạy trên càng nhiều bản phân phối càng tốt, bao gồm các phiên bản Ubuntu khác nhau. Tôi đã cẩn thận sử dụng các phụ thuộc có thể chỉ sau khi người dùng đã cài đặt chúng.

Tuy nhiên, bây giờ tôi nghe rằng gtk_status_icon sẽ không còn được hỗ trợ trong các bản phát hành Ubuntu trong tương lai. Các nhà phát triển được yêu cầu sử dụng các chỉ số ứng dụng thay thế. Điều gì sau đó là thực hành tốt nhất để đảm bảo rằng:

  1. Các biểu tượng cục bộ của ứng dụng được hiển thị đúng
  2. Ứng dụng vẫn sẽ chạy và hiển thị các biểu tượng của nó trong các bản phát hành Ubuntu trong tương lai.
  3. Ứng dụng cũng sẽ chạy và hiển thị các biểu tượng của nó trong các môi trường khác, nơi không được cung cấp applet , libappindicatorpython-appindicator .

Các cơ chế dự phòng chỉ báo ứng dụng cho gtk_status_icon sẽ không hoạt động nếu applet chỉ báo không chạy. Trình thông dịch Python sẽ không chạy nếu không có mô-đun appindicator để nhập từ đó. Tôi có cần phát triển các phiên bản khác nhau cho các bản phân phối khác nhau không hoặc có cách nào tốt hơn để giải quyết vấn đề này không.

Tôi tìm tài liệu về cách sử dụng ApplicationTheicator khác ngoài ví dụ được đưa ra trong Ubuntu Wiki ở đâu? Những lệnh nào được cung cấp để kiểm tra xem applet chỉ báo có đang chạy để tránh lập trình các mã nguồn khác nhau cho Ubuntu so với các bản phân phối không phải của Ubuntu không?

Câu trả lời:


16

Tôi nghĩ rằng nhu cầu ở đây thực sự quyết định nhiều hơn đến thư viện python-appindicator. Nếu nó có mặt, nó sẽ hỗ trợ tất cả các trường hợp dự phòng mà bạn cần. Nó sẽ xử lý XFCE, KDE và Gnome cũ một cách thích hợp. Ví dụ tốt về cách làm điều đó trong câu trả lời này .

Thư viện appindicator sẽ sử dụng DBus để kiểm tra xem quy trình kết xuất chỉ báo ứng dụng có khả dụng hay không. Đây sẽ là trường hợp trên Unity hoặc nếu applet chỉ báo đang chạy. Nếu có sẵn, nó sẽ sử dụng nó, nếu không, nó sẽ chuyển sang sử dụng GtkStatusIcon với cùng một menu.

Thật không may, tôi tin rằng bạn phải giữ cả hai đường dẫn mã nếu bạn muốn xử lý trường hợp thư viện không có sẵn. Mặc dù vậy, chúng tôi rất vui khi được giúp thư viện trong các bản phát hành khác :)


Cảm ơn bạn cho câu trả lời rất rõ ràng này. Điều này chỉ ra con đường tôi sẽ phải đi nếu tôi muốn ứng dụng của mình chạy vào 11.04. Tôi có một lộ trình làm việc cho GtkStatusIcon nhưng sẽ cần phát triển lại toàn bộ cho chỉ số-applet. Nếu tôi hiểu nhận xét của bạn về lỗi # 668375 tôi có thể sử dụng các biểu tượng cục bộ của mình mà không phải tạo toàn bộ chủ đề biểu tượng, tôi có thể không?
Takkat

Đã có thời gian đi sâu vào lập trình AppTheicator, tôi thấy rằng việc sử dụng đề xuất của jgoguen để kiểm tra mô-đun appindicator không thực sự hữu ích, vì các Biểu tượng tùy chỉnh sẽ không hiển thị trong 10.04 LTS. Xem ý kiến ​​của tôi để lỗi # 668375.
Takkat

Câu trả lời của tôi bao gồm một cách rất dễ dàng để giải quyết vấn đề này. Nó hoạt động rất tốt cho ứng dụng của tôi và thậm chí còn không gây khó khăn khi chuyển một ứng dụng sử dụng AppIndicators sang Windows!
Nathan Osman

10

Tôi có một giải pháp tuyệt vời đã hoạt động tốt trong StackApplet - Tôi đã tạo một phiên bản appindicatormô-đun tương đương về chức năng sử dụng gtk.StatusIconnội bộ để cung cấp chức năng giống hệt nhau khi mô-đun thực không tồn tại.

Sử dụng nó đơn giản như:

  1. Tải tập tin sau và gọi nóappindicator_replacement.py
  2. Thêm phần sau vào ứng dụng của bạn:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

Đó là nó! Bây giờ ứng dụng của bạn sẽ chạy hoàn hảo có hoặc không có hỗ trợ cho AppIndicators. Nó thậm chí sẽ chạy trên Windows, giả sử bạn không có bất kỳ mã cụ thể nền tảng nào khác.


Lưu ý: tệp được phát hành theo giấy phép MIT - vì vậy bạn có thể sử dụng nó khá nhiều cho mọi thứ.


9

Bạn sẽ cần phải viết mã cho cả hai. Bạn có thể phát hiện sự hiện diện của appindicator trong mã Python của mình bằng cách sử dụng một cái gì đó tương tự như:

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

Từ đó, sử dụng have_appindicator để quyết định xem bạn nên sử dụng mã appindicator hay mã gtk_status_icon.

Thật không may, điều này cũng có nghĩa là bạn sẽ cần phải có cả Ubuntu và môi trường khác để kiểm tra.


1
Tuy nhiên, có thể có môi trường cài đặt python-appindicator nhưng applet chỉ báo không chạy. Ứng dụng này cũng cần phải xử lý việc này.
Takkat

Đối với trường hợp đó, hãy xem wiki.ubfox.com/DesktopExperienceTeam/ApplicationTheicators > Fallback tùy chỉnh. Theo mặc định, bạn sẽ nhận được gtk.StatusIcon cho chỉ báo ứng dụng nếu không có applet chỉ báo nào xuất hiện.
htorque

Tôi nhận thức được các tùy chọn dự phòng. Điều tôi không hiểu là, nếu applet chỉ báo không chạy, làm thế nào để applet chỉ báo có thể cung cấp dự phòng?
Takkat

Tôi tưởng tượng rằng nó chỉ đơn giản là kiểm tra applet chỉ báo và cung cấp chức năng gtk_status_icon đằng sau hậu trường.
jgoguen

1
@jgoguen: "nó" là gì? Tôi hiểu rằng từ 11.04 Ubuntu / Unity sẽ không hỗ trợ gtk_status_icon nữa. Các bản phân phối khác có thể không có "nó". Tôi thực sự lo lắng về điều này.
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 )

Bằng cách này bạn có thể phát hiện nếu applet chỉ báo đang chạy. Bạn không cần phải lo lắng về Ubuntu 11.04 vì đây không phải là trường hợp. Không có kịch bản dự phòng vì applet chỉ báo là thành phần bắt buộc, chạy theo mặc định.


Cảm ơn bạn đã chỉ ra việc sử dụng PID của applet (tôi đã làm điều này cho các phụ thuộc có thể khác bằng cách sử dụng pidof), đây sẽ là một cách ít thanh lịch hơn nếu không có gì tốt hơn. Theo như tôi có thể thấy applet chỉ báo đang chạy một cách đáng tin cậy với sự thống nhất chỉ khi các yêu cầu phần cứng được đáp ứng. Người dùng sẽ có thể khởi động vào 2D Gnome và có thể quyết định không chạy applet chỉ báo. Tuy nhiên điều này có thể không phải do vấn đề của tôi sau đó.
Takkat

Tôi đồng ý với bạn rằng nó có thể không 'thanh lịch' (nhưng bạn có thể thêm tất cả các loại mỹ phẩm bạn muốn: D) tuy nhiên nó sẽ hoạt động. Cá nhân tôi thích các giải pháp hoạt động tốt và sang trọng đứng thứ hai :)
OpenNingia

Nhiệm vụ này dường như không chạy trên hệ thống 14.04 của tôi. Cách tiếp cận đã được áp dụng? Có rất nhiều /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-servicenhiệm vụ thay thế.
tạm dừng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.