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

如何在Kivy中实现数据自动更新?

解决方法

方案一:使用schedule库实现非阻塞定时更新

schedule是轻量级定时任务库,能轻松实现固定间隔任务,结合线程可避免阻塞主线程。

步骤1:安装schedule

pip install schedule

步骤2:修改代码逻辑

将数据存储在类的实例变量中,定时任务负责更新该变量,datas方法仅返回最新缓存数据:

import requests
import schedule
import time
import threading

class YourClass:
    def __init__(self):
        # 初始化时先拉取一次数据
        self.source_data = self._fetch_data()
        # 启动定时任务
        self._start_scheduler()

    def _fetch_data(self):
        # 封装数据拉取逻辑,统一处理异常
        try:
            return requests.get("http://150.150.150.150/tek.json").json()
        except Exception as e:
            print(f"拉取数据失败: {e}")
            # 失败时返回旧数据,避免界面空数据
            return self.source_data if hasattr(self, 'source_data') else {}

    def datas(self):
        # 直接返回最新缓存,无需重复请求接口
        return self.source_data

    def _update_data(self):
        # 更新数据的任务函数
        self.source_data = self._fetch_data()

    def _start_scheduler(self):
        # 每10秒执行一次更新任务
        schedule.every(10).seconds.do(self._update_data)

        # 单独线程运行schedule,避免阻塞主线程
        def run_scheduler():
            while True:
                schedule.run_pending()
                time.sleep(1)

        # 守护线程:主线程退出时自动结束
        threading.Thread(target=run_scheduler, daemon=True).start()

关键说明

  • 用_fetch_data封装拉取逻辑,便于复用和异常处理
  • 实例变量self.source_data存储最新数据,datas()方法直接返回,减少无效接口请求
  • 定时任务在独立线程运行,不会影响主线程的界面交互或其他逻辑

方案二:GUI应用专用定时器(若程序带界面)

如果使用Tkinter、PyQt等GUI框架,建议用框架自带定时器,比线程更适配GUI事件循环:

Tkinter示例

import requests
import tkinter as tk

class YourGUIApp:
    def __init__(self, root):
        self.root = root
        self.source_data = self._fetch_data()
        # 启动10秒间隔的更新任务
        self._schedule_update()

    def _fetch_data(self):
        try:
            return requests.get("http://150.150.150.150/tek.json").json()
        except Exception as e:
            print(f"拉取数据失败: {e}")
            return self.source_data if hasattr(self, 'source_data') else {}

    def datas(self):
        return self.source_data

    def _update_data(self):
        self.source_data = self._fetch_data()
        # 这里添加界面更新逻辑,比如刷新标签、列表内容
        self._refresh_ui()
        # 重新调度下一次更新
        self._schedule_update()

    def _schedule_update(self):
        # 10000毫秒=10秒,指定时间后调用更新函数
        self.root.after(10000, self._update_data)

    def _refresh_ui(self):
        # 示例:打印更新提示,实际替换为界面渲染逻辑
        print("已加载最新数据,界面已更新")

关键说明

  • GUI框架的定时器基于事件循环实现,不会阻塞主线程,避免界面卡死
  • after方法完成单次调度后,在更新函数中重新调用自身,实现循环更新

为什么不直接用while True + sleep?

主线程中使用while True + sleep会阻塞整个程序(尤其是GUI程序),导致界面无法响应用户操作。而线程或GUI定时器能让更新任务在后台执行,主线程可正常处理交互或其他业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:35:30