Python异步函数未执行排查:Kivy框架下使用python-kasa发现TP-Link智能插座异常
嘿,我来帮你排查代码里的问题~你的代码没执行SeekDevices函数以及无法正常发现设备,主要是几个异步处理和遍历逻辑的问题,下面给你拆解说明并修复:
问题分析
- 异步函数调用方式错误:你定义了
async函数,但直接调用SeekDevices(list)只会返回一个协程对象,不会实际执行异步代码。而且你在async函数里还嵌套了asyncio.run(Discover.discover()),这是错误的用法——async函数内部应该用await来调用其他异步任务,而不是再启动一个新的事件循环。 - 设备遍历逻辑错误:
found_devices.items()返回的是(IP地址, 智能设备对象)的元组,你直接用dev.alias会报错,因为dev是元组,不是设备对象,得取元组的第二个元素才行。 - UI线程安全问题:Kivy的UI操作必须在主线程执行,异步任务里直接添加控件可能会导致异常,需要把UI操作调度到主线程。
修复后的代码
from kivy.uix.screenmanager import ScreenManager, Screen from kivymd.app import MDApp from kivymd.uix.list import MDList, OneLineListItem from kivy.clock import Clock from kasa import Discover import asyncio async def seek_devices(list_widget): # 直接await异步发现接口,避免嵌套事件循环 found_devices = await Discover.discover() # 正确解构items()返回的元组,获取设备对象 for ip, dev in found_devices.items(): # 用Clock将UI操作调度到Kivy主线程执行 Clock.schedule_once(lambda dt, device=dev: list_widget.add_widget(OneLineListItem(text=device.alias))) class DemoApp(MDApp): def build(self): screen = Screen() self.device_list = MDList() screen.add_widget(self.device_list) # 用asyncio.create_task启动异步任务,替代直接调用async函数 asyncio.create_task(seek_devices(self.device_list)) return screen DemoApp().run()
关键修复点说明
- 异步任务启动:用
asyncio.create_task来启动异步函数,这样协程会被加入当前事件循环执行,而不是直接调用返回协程对象。 - 异步调用修正:在async函数内部用
await Discover.discover()替代asyncio.run,避免在已有事件循环中再启动新循环的错误。 - 遍历逻辑修正:通过
ip, dev解构元组,正确获取设备对象,才能访问dev.alias属性。 - UI线程安全:使用
Clock.schedule_once把添加列表项的操作放到Kivy主线程,确保UI操作的安全性。
内容的提问来源于stack exchange,提问作者MohammadAlshamsi
相关产品推荐
相关产品推荐

