2017-03-03 50 views
1
內創建複選框的ID或激活狀態(或其他部件)

我的應用如下3個步驟:Kivy:如何檢索蟒

  • 在步驟1中,用戶輸入一個數字(所有部件都處於.kv文件 - 如下面的代碼)。
  • 在步驟2中,生成了與步驟1中輸入的編號一樣多的標籤和複選框。然後用戶選擇一些複選框並點擊「確定2」按鈕(因爲第二步的部件數量可能會有所不同,所以它們在.py中創建 - 這可能不是最好的方法,但我沒有' t找到了一個更好的主意)。
  • 在步驟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和一個按鈕更加複雜。

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

回答

3

這裏的問題是,ids字典只填充在.kv文件中定義的id值,在python不

但是,您可以創建自己的字典,其中包含對小部件CheckBox的引用。相反,在創建窗口小部件的提供id財產,你可以填充的MyWidget字典屬性(我們稱之爲check_ref)您id每個CheckBox實例鏈接:

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) 
+0

非常感謝!即使'print(self.check_ref)'不打印一個'self.check_ref [CheckBox0] .state',我得到錯誤'name'CheckBox0'未定義' 'CheckBox0'編號。 – Enora

+0

'CheckBox0'應該是一個字符串是嗎? – ODiogoSilva

+0

對不起!最後一個問題。爲什麼這個屬性是'state',兩個值是'normal'和'down',而對於'.kv'中的一個複選框,屬性是'active',值是'True'和'False'? – Enora

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]