Python Kivy:如何打印实例id

Python Kivy:如何打印实例id,python,checkbox,instance,kivy,Python,Checkbox,Instance,Kivy,我有这个代码,我想在选中复选框后打印实例id。我尝试了instance.id和self.ids.instance.ids,但没有成功。只需打印实例就可以得到kivy名称(如)。我使用python 3.6和Kivy 1.9.2.dev0 当我不使用.kv文件时,打印instance.id会起作用(所有应用程序都构建在.py文件中) .kv: #: import CheckBox kivy.uix.checkbox <SampBoxLayout> orientation: "

我有这个代码,我想在选中复选框后打印实例id。我尝试了
instance.id
和s
elf.ids.instance.ids
,但没有成功。只需打印实例就可以得到kivy名称(如
)。我使用python 3.6和Kivy 1.9.2.dev0

当我不使用
.kv
文件时,打印
instance.id
会起作用(所有应用程序都构建在
.py
文件中)

.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)
#:导入复选框kivy.uix.CheckBox
方向:“垂直”
填充:10
间距:10
盒子布局:
方向:“水平”
尺寸提示:55
标签:
文字:“最喜爱的颜色:”
颜色:0,0,0,1
大小提示:265
标签:
文字:“蓝色”
颜色:0,0,0,1
大小提示:15
复选框:
组:“fav_颜色”
id:蓝色
值:root.blue
尺寸提示:0.05
启用时:root.checkbox\u颜色(self,self.active)
标签:
文字:“红色”
颜色:0,0,0,1
大小提示:15
复选框:
组:“fav_颜色”
值:root.red
尺寸提示:0.05
启用时:root.checkbox\u颜色(self,self.active)

您可以在ID中循环,并检查实例是否存在

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()
从kivy.app导入应用
从kivy.uix.boxlayout导入boxlayout
从kivy.lang导入生成器
root=Builder.load\u字符串(“”)
:
复选框:
id:蓝色
启用:root.checkbox\u颜色(自身)
复选框:
身份证号码:红色
启用:root.checkbox\u颜色(自身)
''')
类MyWidget(BoxLayout):
def复选框颜色(自身,实例):
if self.ids.values()中的实例:
打印(列表(self.ids.keys())[list(self.ids.values()).index(实例)])
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
MyApp().run()

您可以在ID中循环,并检查实例是否存在

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()
从kivy.app导入应用
从kivy.uix.boxlayout导入boxlayout
从kivy.lang导入生成器
root=Builder.load\u字符串(“”)
:
复选框:
id:蓝色
启用:root.checkbox\u颜色(自身)
复选框:
身份证号码:红色
启用:root.checkbox\u颜色(自身)
''')
类MyWidget(BoxLayout):
def复选框颜色(自身,实例):
if self.ids.values()中的实例:
打印(列表(self.ids.keys())[list(self.ids.values()).index(实例)])
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
MyApp().run()

您还可以将kv中的自定义值设置为较短的解决方案:

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()
从kivy.app导入应用
从kivy.uix.boxlayout导入boxlayout
从kivy.lang导入生成器
root=Builder.load\u字符串(“”)
:
复选框:
自定义值:“蓝色”
启用:root.checkbox\u颜色(自身)
复选框:
自定义值:“红色”
启用:root.checkbox\u颜色(自身)
''')
类MyWidget(BoxLayout):
def复选框颜色(自身,实例):
打印(实例.自定义值)
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
MyApp().run()

您还可以将kv中的自定义值设置为较短的解决方案:

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()
从kivy.app导入应用
从kivy.uix.boxlayout导入boxlayout
从kivy.lang导入生成器
root=Builder.load\u字符串(“”)
:
复选框:
自定义值:“蓝色”
启用:root.checkbox\u颜色(自身)
复选框:
自定义值:“红色”
启用:root.checkbox\u颜色(自身)
''')
类MyWidget(BoxLayout):
def复选框颜色(自身,实例):
打印(实例.自定义值)
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
MyApp().run()

@Enora更新了它,所以你不需要在ID中循环。
self.ids.keys()[self.ids.values().index(instance)
让我很困惑。我正在处理这个问题,但我仍然无法理解。@Enora
.keys()
函数是一个python函数,它返回字典的键。
{blue:“a”,“red:“b”}
因此您得到
(“蓝色”、“红色”)
。然后
.values()
返回字典
(“a”、“b”)
的值,换句话说就是实例。然后
.index(instance)
函数在值中获得实例的索引。索引被传递到
self.ids.keys()[index]
,因此它将为您提供
“蓝色”
“红色”
这开始有意义了。我刚刚测试了(更新的)代码,我得到了以下错误:AttributeError:“dict_values”对象没有属性“index”(循环运行良好)@Enora因此在python3中,我们需要将
dict_值
dict_键
转换为
list()
函数的列表。同样,您很好:)@Enora更新了它,所以您不需要循环通过id.the
self.ids.keys()[self.ids.values().index(实例)
让我很困惑。我正在经历这件事,但我仍然无法理解。@Enora the
.keys()
函数是一个python函数,它返回字典的键
{“blue”:“a”,“red”:“b”}
所以你得到
(“blue”,“red”)
。然后
.values()
返回字典的值
(“a”,“b”)
换句话说就是实例。然后
.index(instance)
函数在值中获取实例的索引。该索引被传递给
self.ids.keys()[index]
,因此它将为您提供
“蓝色”
“红色”
,这开始有意义了。我刚刚测试了(更新的)代码,我得到了这个错误:AttributeError:“dict_values”对象没有属性“index”(循环运行良好)@Enora,因此在python3中,我们需要将
dict_值
dict_键
转换为带有
list()
函数的列表。你又来了:)