Kodi插件开发求助:调用xbmcplugin.setResolvedUrl()报无效句柄-1
搞定Kodi插件图片显示的问题
首先得理清一个核心误区:你用错函数了!xbmcplugin.setResolvedUrl() 是专门给**可播放媒体(视频、音频)**用的——它的作用是告诉Kodi“这个列表项对应的播放流地址是啥”,完全不适合用来展示静态图片。这就是你遇到一系列问题的根源,咱们一步步拆解:
为什么会出现 Attempt to use invalid handle -1?
这个错误本质是你调用 setResolvedUrl 时传入的handle参数不对。Kodi插件的handle是启动时从 sys.argv[1] 获取的整数(比如 handle = int(sys.argv[1])),你要么没正确传递这个handle,要么在错误的上下文里调用了这个函数,导致Kodi识别到无效的handle值-1。
加了 li.setProperty("IsPlayable", "true") 后错误消失但图片不显示?
你把列表项标记为“可播放”后,Kodi就切换到了媒体播放流程,不再走目录展示的逻辑。但图片不是可播放媒体,setResolvedUrl 拿到图片URL后无法处理,自然就不会显示任何内容——错误是被掩盖了,但问题根本没解决。
正确的图片展示方式
根据你的需求,分两种场景给你正确的代码示例:
场景1:在插件目录里展示带缩略图的图片项
如果只是想把图片作为目录列表里的一个项(带缩略图),用 setArt() 给列表项设置缩略图即可:
import sys import xbmcgui import xbmcplugin # 必须获取正确的插件handle handle = int(sys.argv[1]) def add_image_entry(): # 创建列表项 list_item = xbmcgui.ListItem(label="我的图片") # 设置图片作为缩略图和图标 list_item.setArt({ "thumb": "/path/to/your/image.jpg", "icon": "/path/to/your/image.jpg" }) # 添加到目录,第三个参数False表示这不是子目录 xbmcplugin.addDirectoryItems(handle, [(sys.argv[0], list_item, False)]) # 结束目录加载 xbmcplugin.endOfDirectory(handle) add_image_entry()
场景2:点击项后直接打开图片查看器
如果想让用户点击后直接查看图片,调用Kodi内置的 ShowPicture 功能即可,完全不需要碰 setResolvedUrl:
import sys import xbmcgui import xbmcplugin import xbmc handle = int(sys.argv[1]) IMAGE_PATH = "/path/to/your/image.jpg" def open_image_viewer(): # 调用Kodi内置图片查看器打开图片 xbmc.executebuiltin(f"ShowPicture({IMAGE_PATH})") def build_menu(): list_item = xbmcgui.ListItem(label="查看图片") list_item.setArt({"thumb": IMAGE_PATH, "icon": IMAGE_PATH}) # 给列表项绑定点击动作(通过URL参数传递) url = f"{sys.argv[0]}?action=show_image" xbmcplugin.addDirectoryItems(handle, [(url, list_item, False)]) xbmcplugin.endOfDirectory(handle) # 处理URL参数 if "action=show_image" in sys.argv[2]: open_image_viewer() else: build_menu()
关键总结
- 别再用
xbmcplugin.setResolvedUrl()处理图片了,它只给视频/音频用; - 目录项的缩略图用
ListItem.setArt()设置; - 要打开图片查看器,调用Kodi的
ShowPicture内置函数; - 所有插件相关函数(
addDirectoryItems/endOfDirectory等)必须用正确的handle(从sys.argv[1]获取); - 只有当列表项是可播放媒体时,才设置
IsPlayable=true,别乱加。
内容的提问来源于stack exchange,提问作者Etchot




