Enora Enora -4 years ago 173
Python Question

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 s
elf.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)


As a side question, how can I set the status of the checkbox with the id set to blue to be checked on start up (I thought the line blue = ObjectProperty(True) would do that)

Answer Source

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):
        for i in self.ids:
            if self.ids[i] == instance:
                print(i)


class MyApp(App):

    def build(self):
        return MyWidget()

MyApp().run()
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download