Kivy:如何检索在python

时间:2017-03-03 13:12:44

标签: python checkbox kivy

我的应用程序遵循3个步骤:

  • 在步骤1中,用户输入一个数字(所有小部件都在.kv文件中 - 如下面的代码所示)。
  • 在步骤2中,生成与步骤1中输入的数字一样多的标签和复选框。然后用户选择一些复选框并单击“OK 2”按钮。(因为第二步的小部件数量可能不同,它们是在.py创建的 - 可能不是最好的方法但我还没有找到更好的主意。)
  • 在步骤3中,我获得了在步骤2中生成的复选框的活动状态,并根据哪个是活动的,我做了一些其他步骤。

我的问题是如何获得复选框的状态?当它们被“创建”时,每个都有一个id,但是当我打印self.ids时,这些ID不会出现。如果我将任何参数传递给getcheckboxes_active def,我也会收到错误。 (无可调用)。

.py

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox 
from kivy.uix.button import Button 
from kivy.properties import StringProperty

class MyWidget(BoxLayout):
    input_text = StringProperty("10")


    def show(self, number):
        layout = BoxLayout(padding=10, orientation="vertical")
        for each in range(int(number)):
            layout2 = BoxLayout(padding=10, orientation="horizontal")
            l=Label(bold= True,font_size=20, text='Hello', markup = True)
            c= CheckBox(id = "CheckBox"+str(each))
            layout2.add_widget(l)
            layout2.add_widget(c)
            layout.add_widget(layout2)
        button = Button(text="OK 2")
        button.bind(on_press=self.getcheckboxes_active)  # self.getcheckboxes_active(self, "test") give an error None is not callable
        layout.add_widget(button)
        self.add_widget(layout)

        self.input_text = "Done"

    def getcheckboxes_active(self, *arg):
        '''how to get the active state of all checkboxed created in def show'''
        print(self.ids)  # CheckBoxes id aren't displayed
        print(*arg)
        print("State of all checkboxes")

class MyApp_auto(App):
    def build(self):
        return MyWidget()
MyApp_auto().run()

.kv:我需要一个.kv,因为“第1步真正的应用程序”比TextInput和Button更复杂。

<MyWidget>
    orientation: "horizontal"
    TextInput:
        text: root.input_text
        id:input
    Button:
        text:'OK 1'
        on_press: root.show(input.text)

2 个答案:

答案 0 :(得分:3)

此处的问题是ids字典仅填充了.kv文件中定义的id值,python中的不是

但是,您可以创建自己的字典,其中包含对CheckBox窗口小部件的引用。您可以在创建窗口小部件时提供id属性,而不是填充MyWidget的字典属性(我们称之为check_ref),将id与每个CheckBox相关联{1}}实例:

class MyWidget(BoxLayout):
    input_text = StringProperty("10")

    check_ref = {}

    def show(self, number):
        layout = BoxLayout(padding=10, orientation="vertical")
        for each in range(int(number)):
            layout2 = BoxLayout(padding=10, orientation="horizontal")
            l=Label(bold= True,font_size=20, text='Hello', markup = True)
            c = CheckBox()

            # Stores a reference to the CheckBox instance 
            self.check_ref["CheckBox"+str(each)] = c

            layout2.add_widget(l)
            layout2.add_widget(c)
            layout.add_widget(layout2)
        button = Button(text="OK 2")
        button.bind(on_press=self.getcheckboxes_active)  # self.getcheckboxes_active(self, "test") give an error None is not callable
        layout.add_widget(button)
        self.add_widget(layout)

        self.input_text = "Done"

    def getcheckboxes_active(self, *arg):
        '''how to get the active state of all checkboxed created in def show'''
        # Iterate over the dictionary storing the CheckBox widgets
        for idx, wgt in self.check_ref.items():
             print(wgt.active)

        # You can also get a specific CheckBox
        # print(self.check_ref[--my id--].active)

答案 1 :(得分:0)

可能是一种常见的场景:从字符串列表,制作标签及其相应的复选框,使用前面提到的字典概念,然后将所选复选框标签显示为另一个标签的文本。

class BuildRequester(BoxLayout):
    chkref = {}
    def on_checkbox_active(self,chkbox,value):
        self.ids.label2.text = 'Selected ' + self.chkref[chkbox]
    def __init__(self, **kwargs):
        super(BuildRequester,self).__init__(**kwargs)
        prods = [' B_0003',' B_0007',' B_0008', ' B_0200']

        for i in range(4):
            self.add_widget(Label(text=prods[i],italic=True,bold=True))
            chkbox = CheckBox(group='1',color=[0.1,1,0,4])
            chkbox.bind(active=self.on_checkbox_active)
            self.add_widget( chkbox)
            self.chkref[chkbox]= prods[i]