Python 2.7 对于循环don';我不在kivy python上工作

Python 2.7 对于循环don';我不在kivy python上工作,python-2.7,kivy,Python 2.7,Kivy,嗨:我试图在kivy上做一个简单的应用程序,但在循环中出现了一个错误 解释:我在ScreenManager中有10个屏幕,我需要清除除其中4个之外的所有窗口小部件 按下按钮调用ScreenManager的update()方法 错误:在update()方法中,我有以下代码: self.static_screens = ['list', 'new', 'conf', 'edit'] # declared in __init__ method def update():

嗨:我试图在kivy上做一个简单的应用程序,但在循环中出现了一个错误

解释:我在ScreenManager中有10个屏幕,我需要清除除其中4个之外的所有窗口小部件

按下按钮调用ScreenManager的update()方法

错误:在update()方法中,我有以下代码:

   self.static_screens = ['list', 'new', 'conf', 'edit']  # declared in __init__ method

    def update():
        for screen in self.screens:
            if screen.name not in self.static_screens:
                self.remove_widget(screen)

正常执行,但仅从ScreenManager中删除一个小部件(屏幕)

我不熟悉
kivy
,但我怀疑问题在于您正在对正在迭代的对象进行变异。很多人在尝试使用
for
循环删除列表中的特定项目时都会遇到类似的问题

下面是一个可能的重构,它可能会解决您的问题

def update():
    screens_to_remove = [screen in self.screens if 
                         screen.name not in self.static_screens]
    for screen in screens_to_remove:
        self.remove_widget(screen)

(请注意,我还没有对此进行测试,因为我不确定代码的其余部分是什么样子。)

您是否正在对正在迭代的对象进行变异?如果
self.remove\u小部件(屏幕)
发生变异
self.screens
,那么这将是您的问题。您需要重构。谢谢您的回答,我如何修复它?创建副本?请参阅我的答案。简而言之,创建一个临时列表来存储您希望删除的屏幕。一点也不担心。如果这解决了问题,你应该投票表决我的答案,并将其标记为已接受。:)