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

Kivy开发待办应用新增任务仅重启后显示问题求助

问题根因

  1. MainMenuScreen的构造函数__init__仅在应用启动、屏幕首次创建时执行一次,你从新增任务页跳转回主页时不会重新触发,所以不会重新读取文本文件的新内容。
  2. 现有taskRead方法存在冗余逻辑,循环创建空MDList组件,且没有清空旧的任务列表,多次调用会导致任务重复渲染。
  3. scroll和list_view被定义为类属性,全局共享,后续修改会互相影响。

修复方案

第一步 调整MainMenuScreen类逻辑

把列表容器改为实例属性,新增页面切入时自动触发的刷新逻辑,优化任务读取方法:

import os # 放在文件顶部导入

class MainMenuScreen(Screen):
    listBox = ObjectProperty()
    theme_changer = ObjectProperty()
    search_task = ObjectProperty()
    all_tasks = ObjectProperty()
    important_tasks = ObjectProperty()
    create_list = ObjectProperty()
    completed_tasks = ObjectProperty()
    list_name = ObjectProperty()
    sort = ObjectProperty()
    rename = ObjectProperty()
    add_button = ObjectProperty()

    def __init__(self, **kw):
        super().__init__(**kw)
        # 列表容器改为实例属性,每个屏幕实例单独持有避免共享冲突
        self.scroll = ScrollView()
        self.list_view = MDList()
        self.scroll.add_widget(self.list_view)
        self.listBox.add_widget(self.scroll)
        # 初始化判断任务文件是否存在,避免首次启动读文件报错
        if not os.path.exists('tasks.txt'):
            open('tasks.txt', 'w', encoding='utf-8').close()

    # Kivy屏幕内置方法,每次切入该屏幕时自动执行
    def on_enter(self, *args):
        self.taskRead()

    def taskRead(self):
        # 先清空旧任务项,避免重复渲染
        self.list_view.clear_widgets()
        with open('tasks.txt', 'r', encoding='utf-8') as sv:
            arr = sv.read().strip().split('\n')
        # 过滤空行
        arr = [i for i in arr if i.strip()]
        for task in arr:
            self.list_view.add_widget(OneLineListItem(text=task, on_press=self.scr))

    def scr(self, value):
        self.manager.transition = FadeTransition()
        self.manager.current = 'goodbye_screen'

修改完成后,每次从新增任务页跳转回主页时,都会自动读取最新的任务文件内容刷新列表,无需重启应用即可看到新添加的任务。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:04