私は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()
に電話します。
代わりにインスタンス属性を使用しますか? –