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

Kivy界面无法实时刷新计算后的数据问题求助

Kivy界面无法实时刷新计算后的数据问题求助

大家好,我最近在做Kivy应用时遇到了个头疼的问题:计算完成后界面上的数据没法实时刷新,必须重启App才能看到更新后的内容。

具体情况是这样的:

  • 启动App时,datas()函数会读取本地json文件加载数据;
  • 切换到第二个计算页面时,我特意在计算前用Clock.schedule_once(self.datas)重新拉取数据,控制台也打印了“datas updated”,但界面上就是看不到更新后的名称;
  • 我试过两种方式:直接用Clock调度计算逻辑,或者用线程(给calculate方法加@mainthread装饰器),但两种情况都没法在App运行时让界面实时刷新数据。

下面是我的代码,麻烦大家帮忙排查问题:

PY文件

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.metrics import dp
from kivy.uix.behaviors import ButtonBehavior
from kivy.clock import Clock, mainthread
import json
import threading

class Test(BoxLayout):
    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)
        self.data = self.datas()

    # 首页切换逻辑
    def homepage(self, screenmanager):
        screenmanager.current = 'homepage_screen'
        Clock.schedule_once(self.clear_widgets)

    # 清空组件
    def clear_widgets(self, *args):
        for child in [child for child in self.ids.gridsonuc.children]:
            self.ids.gridsonuc.remove_widget(child)

    # 计算页面切换逻辑
    def second(self,screenmanager):
        screenmanager.current = 'second_screen'
        Clock.schedule_once(self.clear_widgets)
        Clock.schedule_once(self.datas) # 计算前重新拉取数据,但界面不刷新!
        Clock.schedule_once(self.calculate)

        # 尝试过线程方式,但必须给calculate加@mainthread才能运行,同样无法刷新界面
        # mythread1 = threading.Thread(target=self.clear_widgets)
        # mythread1.start()
        # mythread2 = threading.Thread(target=self.datas)
        # mythread2.start()
        # mythread3 = threading.Thread(target=self.calculate)
        # mythread3.start()

    # 计算逻辑
    #@mainthread
    def calculate(self, *args):
        for i in self.data['home']:
            box = BoxLayout(size_hint_y = None, height = dp(50))
            hometeams = Label(text = f'{[i]}', font_name = 'Roboto', font_size = dp(15), size_hint = (0.225, 1), halign='center', bold = True )
            box.add_widget(hometeams)
            self.ids.gridsonuc.add_widget(box)

    # 读取数据
    def datas(self, *args):
        # 注意修改这里的文件路径!!!
        with open ("C:\\Users\\Messi\\Desktop\\Python\\Projects\\Football Tips\\Kivy\\Testing Bugs\\Test1\\data.json", "r") as dosya:
            dataApi = json.load(dosya)
        print('datas updated')
        return dataApi

class TestApp(App):
    def build(self):
        return Test()

if __name__ == '__main__':
    TestApp().run()

KV文件

#:import NoTransition kivy.uix.screenmanager.NoTransition
<Test>:
    ScreenManager:
        transition: NoTransition()
        id: sm
        size: root.width, root.height

        Screen:
            name: 'homepage_screen'
            BoxLayout:
                size_hint: 1, 0.10
                Button:
                    text: 'Calculate'
                    id: underOver_button_homepage
                    on_press: root.second(sm)
                    background_color: 0, 0, 0, 0

        Screen:
            name: 'second_screen'
            BoxLayout:
                spacing: '20dp'
                orientation: 'vertical'

                BoxLayout:
                    size_hint: 1, 0.80
                    ScrollView:
                        scroll_type: ['bars', 'content']
                        bar_margin: '5dp'
                        bar_color: 1, 0.4, 0.769, 1
                        bar_width: '5dp'
                        bar_inactive_color: 1, 0.4, 0.769, 1

                        GridLayout:
                            id: gridsonuc
                            cols: 1
                            spacing: '50dp'
                            size_hint_y: None
                            height: self.minimum_height

                BoxLayout:
                    size_hint: 1, 0.10
                    Button:
                        text: 'Home'
                        id: home_button_underOver
                        on_press: root.homepage(sm)
                        background_color: 0, 0, 0, 0

data.json文件

需要创建该文件,并修改PY文件中datas方法的文件路径:

{"home": ["Manchester City", "Arsenal"]}

我录了一段视频演示问题的具体表现,能更直观看到界面不刷新的情况。

麻烦各位大佬帮忙看看问题出在哪,怎么才能让计算完成后界面实时刷新数据呀?谢谢大家了!

备注:内容来源于stack exchange,提问作者user21099627

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:12:30