基本上,我正在开发一个由多个屏幕组成的Kivy应用程序。最近,我决定给我的应用程序一个小的Refresh按钮,它可以刷新窗口小部件,并重新读取保存文件,以达到某种调试目的,然后我当然从this question's answer上窃取了代码,就像每个程序员都会做的那样。它起作用了,但有一个小问题:每次我按下刷新按钮,不管是什么原因,小部件都会被复制并放在彼此的顶部(即使重新启动功能事先清除了以前的小部件)。以下是我的简化代码:
test.py
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen
from kivy.config import Config
Config.set("kivy", "exit_on_escape", 0)
class First(Screen):
pass
class Second(Screen):
pass
class Test(MDApp):
def restart(self):
self.root.clear_widgets()
self.stop()
Test().run()
Test().run()test.kv
ScreenManager:
First:
Second:
<First>:
MDFloatLayout:
MDTextField:
size_hint: 0.8, 0.2
pos_hint: {'center_x': 0.5, 'top': 0.9}
hint_text: 'owo uwu test im a furry yes'
MDRectangleFlatButton:
text: 'Restart'
size_hint: 0.15, 0.1
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
on_release: app.restart()
<Second>:还要注意,我之所以在这个示例应用程序中使用screens,尽管没有办法访问Second屏幕,是因为我做了一些测试,结果是只有当ScreenManager是根类时才会出现“错误”,其他像FloatLayout这样的程序工作正常。其次,我在本例中使用KivyMD的原因是,由于提示文本的动画效果,使用MDTextField可以更容易地检测到小部件的重复。
有没有人知道问题背后的原因,以及解决方案?任何帮助都将不胜感激。
编辑:以下是演示图片:
在重新启动之前:

重启后:

发布于 2021-09-03 16:54:16
这个问题是,由于Kivy根据文件名自动加载,您的test.kv文件被加载了两次。修复方法是自己控制kv文件的加载。为此,请将kv文件的名称更改为test.kv以外的任何名称,例如not_test.kv。然后在Test App中创建一个build()方法
class Test(MDApp):
def build(self):
from kivy.resources import resource_find
filename = 'not_test.kv'
filename = resource_find(filename) or filename
if filename in Builder.files:
Builder.unload_file(filename)
return Builder.load_file(filename)这段代码卸载kv文件(如果它已经被加载),然后再次加载它以获得根小部件。
https://stackoverflow.com/questions/69045966
复制相似问题