Quick search

Table Of Contents

Source code for kivy.uix.checkbox

'''
CheckBox
========

.. versionadded:: 1.4.0

.. image:: images/checkbox.png
    :align: right

:class:`CheckBox` is a specific two-state button that can be either checked or
unchecked. If the CheckBox is in a Group, it becomes a Radio button.
As with the :class:`~kivy.uix.togglebutton.ToggleButton`, only one Radio button
at a time can be selected when the :attr:`CheckBox.group` is set.

An example usage::

    from kivy.uix.checkbox import CheckBox

    # ...

    def on_checkbox_active(checkbox, value):
        if value:
            print('The checkbox', checkbox, 'is active')
        else:
            print('The checkbox', checkbox, 'is inactive')

    checkbox = CheckBox()
    checkbox.bind(active=on_checkbox_active)
'''

__all__ = ('CheckBox', )

from weakref import ref
from kivy.uix.widget import Widget
from kivy.properties import BooleanProperty, ObjectProperty


[docs]class CheckBox(Widget): '''CheckXox class, see module documentation for more information. ''' active = BooleanProperty(False) '''Indicates if the switch is active or inactive. :attr:`active` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' __groups = {} group = ObjectProperty(None, allownone=True) '''Group of the checkbox. If None, no group will be used (the checkbox is independent). If specified, the :attr:`group` must be a hashable object such as a string. Only one checkbox in a group can be active. :attr:`group` is an :class:`~kivy.properties.ObjectProperty` and defaults to None. ''' def __init__(self, **kwargs): self._previous_group = None super(CheckBox, self).__init__(**kwargs) def on_group(self, *largs): groups = CheckBox.__groups if self._previous_group: group = groups[self._previous_group] for item in group[:]: if item() is self: group.remove(item) break group = self._previous_group = self.group if group not in groups: groups[group] = [] r = ref(self, CheckBox._clear_groups) groups[group].append(r) def _release_group(self, current): if self.group is None: return group = self.__groups[self.group] for item in group[:]: widget = item() if widget is None: group.remove(item) if widget is current: continue widget.active = False def _toggle_active(self): self._release_group(self) self.active = not self.active def _release(self): self.active = not self.active def on_touch_down(self, touch): if not self.collide_point(*touch.pos): return if self.disabled: return True if self.group is None or self.group == '': self._release() elif self.group: if not self.active: self._toggle_active() return True @staticmethod def _clear_groups(wk): # auto flush the element when the weak reference have been deleted groups = CheckBox.__groups for group in list(groups.values()): if wk in group: group.remove(wk) break