【问题标题】:Kivy: how to print instance idKivy:如何打印实例 ID
【发布时间】:2020-11-01 06:49:09
【问题描述】:

我有这段代码,我想在选中复选框后打印实例 ID。我尝试了instance.id 和 self.ids.instance.ids 但没有成功。简单地打印实例给我 kivy 名称(如<kivy.uix.checkbox.CheckBox object at 0x0000000005969660>)。我使用 python 3.6 和 Kivy 1.9.2.dev0。

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

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()

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

【问题讨论】:

    标签: python checkbox instance kivy


    【解决方案1】:

    您可以循环遍历 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()
    

    【讨论】:

    • @Enora 更新了它,所以你不需要遍历 id。
    • self.ids.keys()[self.ids.values().index(instance) 让我很困惑。我正在经历这个reddit.com/r/kivy/comments/2x1pas/accessing_ids_in_python,但我仍然无法理解它。
    • @Enora .keys() 函数是一个 python 函数,它返回字典 {"blue":"a", "red":"b"} 的键,所以你得到 ("blue","red")。然后.values() 返回字典("a","b") 的值,也就是实例。然后.index(instance) 函数获取值中实例的索引。并且索引被传递给self.ids.keys()[index],所以它会给你"blue""red"
    • 这开始变得有意义了。我只是测试(更新的)代码,我收到了这个错误:AttributeError:'dict_values' object has no attribute 'index'(循环通过工作正常)
    • @Enora 所以在python3中,我们需要将dict_valuesdict_keys转换为list()函数的列表。再次欢迎你:)
    【解决方案2】:

    您还可以在 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()
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2022-01-03
      相关资源
      最近更新 更多