Python 类的每个实例的不同列表

Python 类的每个实例的不同列表,python,kivy,Python,Kivy,我知道在python中,类属性是跨类实例共享的。我正在尝试编写一个kivy应用程序,其中第一个屏幕上有一个添加按钮,可以按下该按钮添加更多按钮。按钮在列表中保持跟踪,创建新按钮时会将其添加到列表中 当按下按钮时,屏幕切换到定义第一个屏幕的类的另一个实例。目前,此屏幕由上一屏幕中的按钮列表填充。有没有办法为类的每个实例创建不同的列表 from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.button im

我知道在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()

有没有办法为类的每个实例创建不同的列表

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()

当然,只需将类似于
self的内容设置为列表的实例属性即可。在
\uuuuu init\uuuuuu
中使用实例属性,可以吗?