2011-12-17 8 views
19

Sau khi dành một chút thời gian để tìm cách để ứng dụng cho thanh trình đơn, chúng tôi gần như thừa nhận thất bại. Về cơ bản, chúng tôi chỉ tìm kiếm một ví dụ/con trỏ về cách tạo một ứng dụng sẽ tự đặt trong thanh trình đơn (các biểu tượng nhỏ bên cạnh đồng hồ) và có một trình đơn. Không có gì lạ cả.Làm thế nào để tạo một thanh menu (khay hệ thống) cho OSX bằng Python?

Cảm giác giống như một điều gì đó rất dễ thực hiện, nhưng chúng tôi không thể tìm thấy ví dụ hoạt động.

Có lẽ không thể với Python? Có ai biết làm thế nào người khác làm điều đó?

+0

Có lẽ một câu hỏi liên quan: http://stackoverflow.com/questions/3104818/cross-platform-python-gui-suitable-for-taskbar-win-and-menubar-mac- functiona –

+1

Làm thế nào về [pyObjC] (http://pyobjc.sourceforge.net/)? – talonmies

+0

Cảm ơn tài năng! Tôi gặp vấn đề khi cài đặt nó. Đã thử easy_install nhưng không thành công. Sau đó, tôi tải về mã nguồn và cố gắng biên dịch nó (python 2.7.1), nhưng tôi nhận được lỗi này: error: Không thể tìm thấy phân phối phù hợp cho Requirement.parse ('pyobjc-framework-ServiceManagement == 2.4a0'). Có vẻ như điều này có thể yêu cầu một số công việc. – freeall

Trả lời

24

Một tùy chọn sẽ là sử dụng rumps cung cấp mức trừu tượng trên đỉnh PyObjC. Tôi đã viết nó đặc biệt để nhanh chóng tạo ra các loại ứng dụng thanh trạng thái đơn giản này.

Tôi hy vọng rằng điều này có thể giúp một vài người ở đó tìm kiếm một giải pháp đơn giản, ngữ nghĩa!

Đoạn mã mẫu ngắn sau. Trang trí được sử dụng để đăng ký các chức năng như gọi lại cho các sự kiện nhấp chuột và giờ. Ngoài ra còn có hỗ trợ cho 10.8 thông báo.

import rumps 

class AwesomeStatusBarApp(rumps.App): 
    def __init__(self): 
     super(AwesomeStatusBarApp, self).__init__("Awesome App") 
     self.menu = ["Preferences", "Silly button", "Say hi"] 

    @rumps.clicked("Preferences") 
    def prefs(self, _): 
     rumps.alert("jk! no preferences available!") 

    @rumps.clicked("Silly button") 
    def onoff(self, sender): 
     sender.state = not sender.state 

    @rumps.clicked("Say hi") 
    def sayhi(self, _): 
     rumps.notification("Awesome title", "amazing subtitle", "hi!!1") 

if __name__ == "__main__": 
    AwesomeStatusBarApp().run() 

pic

+0

Tôi đã thử chạy mã mẫu trong readme và tất cả các mục menu ngoại trừ "Thoát" bị tắt. Trừ khi tôi thêm setAction_ một cách rõ ràng, các menuitem bị vô hiệu hóa. Đây có phải là hành vi mong đợi không? –

+0

Tôi đã phải làm 'cổng cài đặt py-pip && pip cài đặt pyobjc rumps' để có được ví dụ để làm việc. Cảm ơn! – e40

12

wxPython sẽ không thể thêm mục thanh tác vụ. Bạn có thể làm điều này bằng cách thay vì sử dụng PyObjC như vậy:

from AppKit import NSStatusBar 
status_item = NSStatusBar.systemStatusBar().statusItemWithLength_(-1) #NSVariableStatusItemLength 
status_item.setImage_(<NSImage instance to status icon>) 

Chỉ cần tham khảo các tài liệu tham khảo lớp NSStatusItem để làm công cụ để mục, ví dụ thêm menu, thay đổi hình ảnh đánh dấu, v.v.

+1

Cảm ơn, nhiều đánh giá cao! Bây giờ nếu chỉ có tôi có thể nhận được PyObjC cài đặt ... – freeall

+1

hi freeall, nếu bạn đang sử dụng python 2.6 và lên, tôi nghĩ rằng một easy_install của pyobjc sẽ làm việc tốt, nhưng tôi đề nghị bạn không làm điều này - OSX đi kèm với pyobjc (Tôi không chắc chắn với Lion, nếu nó không có nó, bạn có thể chỉ cần đi trước với easy_install). kiểm tra bạn mặc định Python nếu nó đã cài đặt nó bằng cách nhập objc hoặc AppKit – maranas

+0

Cảm ơn rất nhiều! Đó là một vài giờ bị mất ngày hôm qua, sau đó :) Tôi thường lập trình trong JavaScript (NodeJS) vì vậy tôi quên rằng Python là "pin bao gồm". – freeall