2017-12-01 3 views
-1

私はPythonクラスで知っていますが、属性はクラスのインスタンス間で共有されています。私は最初の画面にボタンを追加するために押すことができる追加ボタンがあるkivyアプリを書こうとしています。ボタンはリスト内で追跡され、新しいボタンが作成されると、リストに追加されます。クラスのインスタンスごとに異なるリスト

ボタンを押すと、画面は最初の画面を定義するクラスの別のインスタンスに切り替わります。この画面には、前の画面のボタンのリストが表示されます。クラスの各インスタンスごとに異なるリストを作成する方法はありますか?

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.properties import NumericProperty, ReferenceListProperty,\ 
    ObjectProperty 
from kivy.clock import Clock 
from kivy.uix.screenmanager import ScreenManager, Screen 

class TasksWindow(Screen): 
    btnHeight=.9 
    btnList=[] 
    def __init__(self): 
     super(TasksWindow, self).__init__() 
     addBtn = Button(text = "+",pos_hint= {'x': .9,'top': 1},size_hint = (.1,.1)) 
     self.add_widget(addBtn) 
     addBtn.bind(on_press=self.clkAdd) 
     backBtn = Button(text = "Go Back",pos_hint= {'x': 0,'top': 1},size_hint = (.1,.1)) 
     backBtn.bind(on_press=self.clkBack) 
     self.add_widget(backBtn) 

    def clkAdd(self, obj): 
     task = Task() 

    def update(self): 
     for x in range (0, len(self.btnList)): 
      temp = self.btnList.pop(x) 
      if (x == 0): 
       TasksWindow.btnHeight = .9 
      temp2 = Task() 
      self.btnList.insert(x,temp2) 
      del(self.btnList[len(self.btnList)-1]) 
      self.add_widget(temp2.editBtn) 

    def preupdate(self,dt): 
     bPoint = -1 
     for x in range (0, len(self.btnList)): 
      self.remove_widget(self.btnList[x]) 
     self.update() 

    def clkBack(self, obj): 
     sm.current = 'Screen 0' 

class Task(TasksWindow): 
    def __init__(self): 
     if len(TasksWindow.btnList)==0: 
      TasksWindow.btnHeight = .9 
     self.editBtn = Button(text = "Tap to Edit",pos_hint= {'x': 0,'top': TasksWindow.btnHeight},size_hint = (.9,.1)) 
     self.editBtn.bind(on_press=self.clkEdit) 
     TasksWindow.btnList.append(self) 
     TasksWindow.btnHeight -= .1 

    def clkEdit(self, obj): 
     screen = TasksWindow() 
     screen.name = ('Screen 1') 
     sm.add_widget(screen) 
     sm.current = ('Screen 1') 
     Clock.schedule_interval(screen.preupdate, 1.0/2.0) 

sm = ScreenManager() 
screen = TasksWindow() 
screen.name = 'Screen 0' 
sm.add_widget(screen) 
sm.current = 'Screen 0' 
Clock.schedule_interval(screen.preupdate, 1.0/2.0) 

class TasksApp(App): 
    def build(self): 
     return sm 

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

それはここでは示されていないですが、その理由は私がpreupdate()を使用して、私は、ボタンを削除することができますので、update()です。私はすべてのボタンをクリアし、リストから削除したボタンを削除してから、update()に電話します。

+0

代わりにインスタンス属性を使用しますか? –

答えて

0

クラスのインスタンスごとに異なるリストを作成する方法はありますか?

ちょうどあなた__init__self.the_list = []のようなものを置くことによって、リストにインスタンスの属性を作成し、確認してください。

関連する問題