在PyObjC中使用EventKit访问日历时遇到实体类型参数传递问题
在PyObjC中使用EventKit访问日历时遇到实体类型参数传递问题
别担心,这个问题一点都不蠢!刚从Swift转PyObjC的时候,确实容易被Objective-C和PyObjC之间的方法名、参数映射搞懵,我来帮你一步步解决~
核心问题拆解
Swift里的EventStore.calendars(for entityType:.Events),对应的Objective-C方法是calendarsForEntityType:,而PyObjC会把Objective-C的冒号语法转换成下划线分隔的方法名,同时实体类型参数也有对应的常量。
1. 获取指定类型的所有日历
你之前调用ek_event_store.calendars()返回None,是因为这个方法需要传入实体类型参数,正确的写法应该是:
from EventKit import EKEventStore, EKEntityTypeEvent ek_event_store = EKEventStore.alloc().init() # 获取所有事件类型的日历(对应Swift的.Events) calendars = ek_event_store.calendarsForEntityType_(EKEntityTypeEvent)
如果要获取提醒事项类型的日历,就用EKEntityTypeReminder代替EKEntityTypeEvent。
2. 通过日历ID获取指定日历
你之前用ek_event_store.calendar(my_cal_identifier)报错,是因为Objective-C里对应的方法是calendarWithIdentifier:,PyObjC里要写成下划线形式:
my_cal_identifier = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' my_cal = ek_event_store.calendarWithIdentifier_(my_cal_identifier) # 可以加个判断,避免拿到空值 if my_cal: print(f"找到日历:{my_cal.title()}") else: print("未找到对应ID的日历")
额外提醒:权限请求
别忘了在访问日历前请求权限,不然可能拿不到数据,这里给你加一段权限请求的示例:
import objc # 检查当前权限状态 status = ek_event_store.authorizationStatusForEntityType_(EKEntityTypeEvent) if status == 0: # EKAuthorizationStatusNotDetermined,用户还未选择 # 发起权限请求 def completion_handler(granted, error): if granted: print("已获得日历访问权限") # 权限通过后再执行日历操作 calendars = ek_event_store.calendarsForEntityType_(EKEntityTypeEvent) print(calendars) else: print("未获得日历访问权限") ek_event_store.requestAccessToEntityType_completion_(EKEntityTypeEvent, completion_handler) # 脚本环境下需要启动runloop等待回调 objc.retain(ek_event_store) objc.autoreleasePool().drain()
备注:内容来源于stack exchange,提问作者Georg Pfolz
相关产品推荐
相关产品推荐

