如何在使用kv文件的Kivy项目中刷新ScreenList的GridLayout列表
问题原因
你当前的ScreenList页面的列表数据加载逻辑写在__init__初始化方法中,该方法仅会在页面首次创建时执行一次,后续从详情页跳转回列表页时不会重新触发,因此数据库更新后列表页展示的仍是旧的渲染结果。
修复方案
- 将列表页加载数据的逻辑从
__init__中抽为独立方法,每次进入列表页时重新加载最新数据 - 进入列表页时先清空原有控件,再渲染新的列表内容
- 顺带修复
ScreenDetail中SQL查询参数的语法错误(参数需要传元组,否则会触发参数不匹配报错)
修改后的核心代码
1. ScreenList类调整
class ScreenList(Screen): data_grid = ObjectProperty() def go_to_detail(self, instance): global cur_id cur_id = int(instance.text) self.manager.current = 'screen_detail' def __init__(self, **kwargs): super(ScreenList, self).__init__(**kwargs) self.data_grid.bind(minimum_height=self.data_grid.setter('height')) # 新增on_enter方法,每次进入页面时自动触发 def on_enter(self): # 清空原有列表控件 self.data_grid.clear_widgets() # 重新查询数据库加载最新数据 con_list_course = sqlite3.connect(db_path) con_list_course.row_factory = donnee_dic curss_list_course = con_list_course.cursor() data_list_course = curss_list_course.execute("select * FROM courses") for row in data_list_course: template_screen = GridLayout(cols=2, size_hint_y=None, height=40) template_screen.add_widget(Label(text=row['nom'])) template_screen.add_widget(Button(text=str(row['id']), on_press=self.go_to_detail)) self.data_grid.add_widget(template_screen) con_list_course.close()
2. ScreenDetail的on_enter方法调整
def on_enter(self): global cur_id conn = sqlite3.connect(db_path) # 修复参数格式,必须传入元组 cursor = conn.execute("select * FROM courses where id=?", (str(cur_id),)) for row in cursor: self.label_id.text = str(row[0]) self.label_nom.text = str(row[1]) cursor.close()
修改完成后,每次从详情页跳转回列表页时,都会自动触发on_enter方法重新加载最新的数据库数据渲染列表,即可实现列表正常刷新。
内容的提问来源于stack exchange,提问作者Bak
相关产品推荐
相关产品推荐

