MagTun
MagTun

Reputation: 6185

Kivy: how to print instance id

I have this code and I would like to print the instance id once a checkbox is checked. I tried instance.id and self.ids.instance.ids but without success. Simply printing the instance gives me the kivy name (like <kivy.uix.checkbox.CheckBox object at 0x0000000005969660>). I use python 3.6 and Kivy 1.9.2.dev0.

Printing instance.id works when I don't use a .kv file (all the app is build in the .py file)

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.core.window import Window

class SampBoxLayout(BoxLayout):

    # For radio buttons
    blue = ObjectProperty(True)
    red = ObjectProperty(False)

    def checkbox_color(self, instance, value):
        if value is True:
            print("Is checked", instance.id)  # How to print the instance ID (I also tried  self.ids.instance.ids)
        else:
            print("Is not checked")

class SimpleApp(App):
    def build(self):
        Window.clearcolor = (1, 1, 1, 1)
        return SampBoxLayout()

sample_app = SimpleApp()
sample_app.run()

The .kv:

#: import CheckBox kivy.uix.checkbox


<SampBoxLayout>
    orientation: "vertical"
    padding: 10
    spacing: 10
    BoxLayout:
        orientation: "horizontal"
        size_hint_x: .55
        Label:
            text: "Favorite Color:"
            color: 0, 0, 0, 1
            size_hint_x: .265
        Label:
            text: "Blue"
            color: 0, 0, 0, 1
            size_hint_x: .15
        CheckBox:
            group: "fav_color"
            id : blue
            value: root.blue
            size_hint_x: .05
            on_active: root.checkbox_color(self, self.active) 
        Label:
            text: "Red"
            color: 0, 0, 0, 1
            size_hint_x: .15
        CheckBox:
            group: "fav_color"
            value: root.red
            size_hint_x: .05
            on_active: root.checkbox_color(self, self.active)

Upvotes: 0

Views: 1715

Answers (2)

Timo Richter
Timo Richter

Reputation: 174

You can also set custom values in the kv as a shorter solution:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder


root = Builder.load_string('''

<MyWidget>:
    CheckBox:
        custom_value: "blue"
        on_active: root.checkbox_color(self)
    CheckBox:
        custom_value: "red"
        on_active: root.checkbox_color(self)

''')

class MyWidget(BoxLayout):

    def checkbox_color(self, instance):
        print(instance.custom_value)


class MyApp(App):

    def build(self):
        return MyWidget()

MyApp().run()

Upvotes: 1

el3ien
el3ien

Reputation: 5405

You can loop throug the ids, and check if the instance is there.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder


root = Builder.load_string('''

<MyWidget>:
    CheckBox:
        id: blue
        on_active: root.checkbox_color(self)
    CheckBox:
        id: red
        on_active: root.checkbox_color(self)

''')

class MyWidget(BoxLayout):

    def checkbox_color(self, instance):
        if instance in self.ids.values():
            print(list(self.ids.keys())[list(self.ids.values()).index(instance)])    


class MyApp(App):

    def build(self):
        return MyWidget()

MyApp().run()

Upvotes: 1

Related Questions