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

