You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
关键修复点说明
  1. 异步任务启动:用asyncio.create_task来启动异步函数,这样协程会被加入当前事件循环执行,而不是直接调用返回协程对象。
  2. 异步调用修正:在async函数内部用await Discover.discover()替代asyncio.run,避免在已有事件循环中再启动新循环的错误。
  3. 遍历逻辑修正:通过ip, dev解构元组,正确获取设备对象,才能访问dev.alias属性。
  4. UI线程安全:使用Clock.schedule_once把添加列表项的操作放到Kivy主线程,确保UI操作的安全性。

内容的提问来源于stack exchange,提问作者MohammadAlshamsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:37:46