【问题标题】:Different list for each instance of class [duplicate]每个类实例的不同列表[重复]
【发布时间】:2017-12-01 21:13:55
【问题描述】:

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

【问题讨论】:

  • 改用实例属性?

标签: python kivy


【解决方案1】:

有没有办法为类的每个实例设置不同的列表?

当然,只需将 self.the_list = [] 之类的内容放在您的 __init__ 中,即可使列表成为实例属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多