2017-10-04 12 views
0

こんにちは:私はkivy上で単純なアプリケーションを実行しようとしていて、ループでエラーが発生しています。forループがkivy pythonで動作しない

説明:私はScreenManagerに10個の画面があり、4個を除くすべてのウィジェットをクリアする必要があります。

ボタンon_pressは、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の

+0

はあなたが反復処理されているオブジェクトを変異されていますか? 'self.remove_widget(screen)'が 'self.screens'を変更すると、それが問題になります。あなたはリファクタリングする必要があります。 –

+0

あなたの答えをありがとう、どのように私はそれを修正することができますか?、コピーを作成しますか? – Krilosax

+0

私の答えを見てください。要するに、削除する画面を保存するための一時的なリストを作成することです。 –

答えて

1

からわずか1ウィジェット(画面)を削除し、私は精通していませんよ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) 

(私は、コードの残りの部分がどのようなものかわからないとして、私はこれをテストしていないことに注意してください。)

+0

その作品は完全に、たくさんのthansk – Krilosax

+0

全くの心配はありません。これで問題が解決した場合は、私の答えをupvoteし、受け入れたとマークする必要があります。 :) –

関連する問題