Python 当调用clear\u小部件时,它不会删除ScreenManager中的屏幕

Python 当调用clear\u小部件时,它不会删除ScreenManager中的屏幕,python,kivy,Python,Kivy,我在我的Kivy gui应用程序中有一个嵌套的屏幕管理器,它们都加载下一个和上一个屏幕,并且工作非常好 我有一个按钮,可以重新加载每一个屏幕,为了避免重复,我必须先删除所有屏幕,然后调用重建所有屏幕和其中的小部件的功能 但每当我做一些,屏幕不会被删除。在所有当前屏幕名称的帮助下,print(self.screen\u name)每次按下按钮,我都能看到屏幕上发生了什么 未按下按钮时屏幕名称: ['Screen 1'、'Screen 2'、'Screen 3'、'Screen 4'] 我按下按钮屏

我在我的Kivy gui应用程序中有一个嵌套的屏幕管理器,它们都加载下一个和上一个屏幕,并且工作非常好

我有一个按钮,可以重新加载每一个屏幕,为了避免重复,我必须先删除所有屏幕,然后调用重建所有屏幕和其中的小部件的功能

但每当我做一些,屏幕不会被删除。在所有当前屏幕名称的帮助下,
print(self.screen\u name)
每次按下按钮,我都能看到屏幕上发生了什么

未按下按钮时
屏幕名称
['Screen 1'、'Screen 2'、'Screen 3'、'Screen 4']

我按下按钮
屏幕名称后
[‘屏幕2’、‘屏幕4’、‘屏幕1’、‘屏幕2’、‘屏幕3’、‘屏幕4’]

第二次按下
屏幕名称
['Screen 4'、'Screen 2'、'Screen 4'、'Screen 1'、'Screen 2'、'Screen 3'、'Screen 4']

第三次按下
屏幕名称
['Screen 2'、'Screen 1'、'Screen 3'、'Screen 1'、'Screen 2'、'Screen 3'、'Screen 4']

第三次推送后,我总是得到以下输出:
[‘屏幕1’、‘屏幕1’、‘屏幕3’、‘屏幕1’、‘屏幕2’、‘屏幕3’、‘屏幕4’]

而切换屏幕会变得一团糟,因为经理不知道切换到哪个屏幕

py:

我尝试了
remove\u widget()
,但出现了一个完全不同的错误

Edit1:一个最小的可运行示例:

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen

Dict = {'rand1': 1, 'rand2':2, 'rand3':3}

class Manager(ScreenManager):
    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)
        Clock.schedule_once(self.pst_nt, 0)

    def refresh(self):
        print(self.screen_names)
        self.pst_nt(None)
        self.current = 'Screen 1'


    def next_s(self):
        self.current = self.next()
        self.transition.direction = 'left'

    def previous_s(self):
        self.current = self.previous()
        self.transition.direction = 'right'

    def pst_nt(self, dt):
        self.clear_widgets()
        #dn.load()        # this is needed for my project
        screen_number = 0
        for k, v in Dict.items():
            screen_number += 1
            self.mainlbl = Label(text='{}  {}'.format(screen_number, str(k)),
                                       font_size='13sp',
                                       size_hint=(.5, 1))
            self.refbtn = Button(text='Refresh',
                                 size_hint=(1, .3),
                                 on_release=lambda x: self.refresh())
            self.next_btn = Button(text='Next',
                                   size_hint=(1, .2),
                                   on_release=lambda x: self.next_s())
            self.back_btn = Button(text='Back',
                                   size_hint=(1, .2),
                                   on_release=lambda x: self.previous_s())
            self.bxlt = BoxLayout(orientation= 'vertical',size_hint=(1, 1))

            self.bxlt.add_widget(self.mainlbl)
            self.bxlt.add_widget(self.refbtn)
            self.bxlt.add_widget(self.next_btn)
            self.bxlt.add_widget(self.back_btn)

            self.scrn = Screen(name='Screen {}'.format(screen_number))

            self.scrn.add_widget(self.bxlt)
            self.add_widget(self.scrn)

class TestApp(App):
    def build(self):
        return Manager()

if __name__ == '__main__':
    TestApp().run()

因此,在本例中,我按下刷新按钮后,无法加载一些屏幕。

您在Kivy,
ScreenManager中发现了一个错误。clear\u widgets
无法正确地在屏幕上迭代

我创建了一个拉请求来修复此问题。它应该包含在下一个Kivy版本中

同时,您可以通过在ScreenManager子类中覆盖clear_小部件来解决此问题:

def clear_widgets(self, screens=None):
    if screens is None:
        screens = self.screens

    for screen in screens[:]:
        self.remove_widget(screen)

这与我在上面推出的修复程序相同。

请发布一个最小的可运行示例来演示prolbem。@我已经添加了一个。
def clear_widgets(self, screens=None):
    if screens is None:
        screens = self.screens

    for screen in screens[:]:
        self.remove_widget(screen)