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

Kivymd Clock报错:callback必须为可调用对象,求实时更新Label数据方案

KivyMD实时更新Label显示服务器数据问题解决

错误原因

  • Clock.schedule_interval()要求第一个参数是可调用对象(如函数),你传入了字符串msg,这是报错的直接原因
  • 仅在build()中接收一次服务器数据,无法实现每秒更新
  • 使用While True会阻塞Kivy的UI主线程,导致界面无响应

修正方案及代码

以下是修复后的完整代码,解决了上述所有问题:

from kivy.lang import Builder
from kivy.clock import Clock
from kivymd.app import MDApp
from socket import *
from kivymd.uix.label import MDLabel

class TestApp(MDApp):
    def build(self):
        # 初始化socket客户端并保存为实例变量
        self.client = socket(AF_INET, SOCK_STREAM)
        self.client.connect(('192.168.5.99', 7000))
        # 设置socket为非阻塞模式,避免recv阻塞UI线程
        self.client.setblocking(False)
        
        self.label1 = MDLabel(font_style="H5", pos_hint={'center_x': 0.5, 'center_y': 0.5})
        # 调度更新函数,每秒执行一次
        Clock.schedule_interval(self.update_label, 1)
        return self.label1
    
    def update_label(self, dt):
        # 尝试接收服务器数据,处理非阻塞的无数据异常
        try:
            data = self.client.recv(1024)
            if data:
                msg = data.decode('utf-8')
                self.label1.text = msg
        except BlockingIOError:
            # 无数据时跳过,不做处理
            pass

TestApp().run()

关键说明

  • 将socket客户端保存为self.client实例变量,确保在更新函数中能持续访问
  • 开启socket非阻塞模式,避免recv()因等待数据阻塞UI线程
  • update_label作为可调用函数传入Clock.schedule_interval,dt参数是Kivy自动传入的时间间隔,必须保留
  • 每次调度时尝试接收数据,有新数据则更新Label的文本内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:12