Kivy:如何重置复选框的活动值

时间:2019-06-04 15:20:16

标签: python python-3.x kivy

当我在屏幕之间切换时,我想清除选中的复选框。当我切换屏幕时,选中的复选框保持选中状态。

我认为,如果我找到一种在切换到另一个屏幕时更改复选框激活状态的方法,那么我的问题就可以解决。

但是我不知道该怎么做。

我的代码也有一定数量的复选框,我只能选择其中六个。我的主文件中的功能是计算它们。

我的main.py

class SkillChose(Screen):
    checkboxvalues = {}
    for i in range(1, 21):
        checkboxvalues["s{}".format(i)] = -2
    def __init__(self,**kwargs):
        super(SkillChose,self).__init__(**kwargs)
        self.click_count = 0
        self.skills=[]

    def click_plus(self,check,id):
        if check is True:
            self.click_count+=1
            self.checkboxvalues[id]=1
        return True
    def click_extraction(self,id):
        if self.checkboxvalues[id]==1:self.click_count-=1
        self.checkboxvalues[id]=0
        return False
    def control(self,id):
        if id==0:return False
        count=0
        for open in self.checkboxvalues.values():
            if open==1:
                count+=1
        for i,j in self.checkboxvalues.items():
            print(i,j)
        if count<6:
            return True
        else:
            return False


my.kv文件

<SkillChose>:
    name:"skill"
    BoxLayout
        ScrollView:
            size: self.size
            GridLayout:
                id: grid
                size_hint_y: None
                row_default_height: '50sp'
                height: self.minimum_height
                cols:2
                Label:
                Label:
                Label:
                    text:"skill1"
                CheckBox:
                    value:"s1"
                    active:(root.click_plus(self.active,self.value) if root.control(self.value) else False ) if self.active else root.click_extraction(self.value)
                Label:
                    text:"skill2"
                CheckBox:
                    value:"s2"
                    active:(root.click_plus(self.active,self.value) if root.control(self.value) else False ) if self.active else root.click_extraction(self.value)
                Label:
                    text:"skill3"
                CheckBox:
                    value:"s3"
                    active:(root.click_plus(self.active,self.value) if root.control(self.value) else False ) if self.active else root.click_extraction(self.value)

1 个答案:

答案 0 :(得分:0)

离开屏幕时,需要以下增强功能(kv文件和Python脚本)来清除CheckBox的属性active

kv文件

使用ScreenManager on_leave事件来调用回调,例如reset_checkbox()

摘要-kv文件

<SkillChose>:
    name:"skill"

    on_leave: root.reset_checkbox()

    BoxLayout:
        ...

Py文件

  • 添加导入语句from kivy.uix.checkbox import CheckBox
  • 使用for循环通过GridLayout:遍历ids.grid的子代
  • 使用isinstance()函数检查CheckBox小部件

摘要-Py文件

class SkillChose(Screen):
    ...
    def reset_checkbox(self):
        for child in reversed(self.ids.grid.children):
            if isinstance(child, CheckBox):
                child.active = False    
    ...