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
相关产品推荐
相关产品推荐

