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()
可能没有任何效果。
备注
这不是我的代码,我试图创建一个最小的可重现示例。
代码
这是我的 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()
可能没有任何效果。