Kivy "KeyError: " (I have made a minimal reproducible example )

Kivy "KeyError: " (I have made a minimal reproducible example )

备注

这不是我的代码,我试图创建一个最小的可重现示例。

代码

这是我的 python 代码的一部分:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from PIL import Image
from kivy.clock import Clock
import threading


class MyFloatLayout(FloatLayout):
    def __init__(self, **kwargs):
        super(FloatLayout, self).__init__(**kwargs)

class GUI2App(App):
    remainingFolders=0
    totalFolders=0
    def update_progress(self):
        Clock.schedule_once(GUI2App.update_progress_after(self))
    def update_progress_after(self):
        print("running")
        print("Ids:\n",self.root.ids)
        loadingBar= self.root.ids['loadingBar']
        loadingBar.max=self.totalFolders
        loadingBar.value=self.remainingFolders

    def build(self):
        self.title = 'Past Paper Question Search '
        return MyFloatLayout()
    def initConcatenate(self):
        p = threading.Thread(target=self.concatenate)
        p.start()
    def concatenate(self):
        totfolders=1
        for x in range(50):
            totfolders+=1     
        self.totalFolders=int(totfolders)
        self.update_progress()

        for x in range(50):
            totfolders-=1
            self.remainingFolders=totfolders
            self.update_progress()

if __name__ == "__main__":
    GUI2App().run()

这是我的 kv 文件的一部分:

#:kivy 2.0.0
<MyFloatLayout>:
    ProgressBar:
        id: loadingBar
        max: 0
        value: 1
        pos_hint: {"x":0.2, "y":0.5}
        size_hint_x: 0.6
        size_hint_y: 0.1
    Button:
        text: "press me to change bar!"
        pos_hint: {"x":0.2, "y":0.6}
        size_hint_x: 0.6
        size_hint_y: 0.1
        on_press: app.initConcatenate()

错误

它抛出这个错误:

in update_progress
     loadingBar= self.ids['loadingBar']
 KeyError: 'loadingBar'

额外信息

当我调用该函数时,它被另一个 class 中的另一个函数调用,为了不出现缺少一个位置参数(self)的错误,我这样调用函数:“MyFloatLayout()。 update_progress()".

不知道是否有帮助,但希望有帮助

我无法重现您提到的错误,但您的代码中还有其他一些错误。主要错误在您的代码中:

def update_progress(self):
    Clock.schedule_once(GUI2App.update_progress_after(self))

此代码是 运行 GUI2App.update_progress_after(self) 并尝试安排该方法的 returned 结果,但 return 是 None。要更正此错误,请将上面的代码替换为:

def update_progress(self):
    Clock.schedule_once(self.update_progress_after)

并向 update_progress_after() 方法定义添加一个 *args 参数:

def update_progress_after(self, *args):

此外,如果您使用:

MyFloatLayout().update_progress()

您正在创建 MyFloatLayout 的新实例并调用该新实例的 update_progress() 方法。但是 MyFloatLayout 的新实例不是您的 GUI 中的实例,因此调用它的 update_progress() 可能没有任何效果。