我有一个带有几个小部件的kv文件,它们的ID是数字(以字符串表示)。让我们说这是从1到10的数字。
我可以通过在方法调用中使用它们的ID(字符串形式的整数)而不是显式使用ID名称来以某种方式从Python访问这些小部件吗? 例如(如图所示,它确实不起作用),我想使用类似的东西:
for i in range (1, 11)
self.root.ids.str(i).text = str(i*5)
而不是:
self.root.ids.1.text = str(5)
self.root.ids.2.text = str(10)
self.root.ids.3.text = str(15)
... etc
原因是这个小部件列表可能会变大。我想访问的范围(切片)也可能不同。
答案 0 :(得分:1)
在这种情况下,您可以使用(defun join (l &key (sep ", "))
(format nil (format nil "~a~a~a" "~{~a~^" sep "~}") l))
(join '(1 2 3))
; ==> "1, 2, 3"
(join '(1 2 3) :sep #\Tab)
; ==> "1 2 3"
:
<强> test.kv 强>
getattr
<强> main.py 强>
BoxLayout:
orientation: "vertical"
Label:
id: 1
Label:
id: 2
Label:
id: 3
Label:
id: 4
Label:
id: 5
Button:
text: "press me"
on_press: app.testFn()
或者利用self.ids是一个字典,其中键是id,值是小部件。
from kivy.app import App
class TestApp(App):
def testFn(self):
for i in range(1, 6):
getattr(self.root.ids, str(i)).text = str(5*i)
if __name__ == '__main__':
TestApp().run()
注意:请注意,from kivy.app import App
class TestApp(App):
def testFn(self):
for i in range(1, 6):
self.root.ids[str(i)].text = str(5*i)
if __name__ == '__main__':
TestApp().run()
的过去必须是字符串。
<强>更新强>
<强> calculation.kv 强>
self.ids[]
<强> main.py 强>
BoxLayout:
CustomLabel1:
id: 1
CustomLabel2:
id: 2
CustomLabel3:
id: 3
CustomLabel4:
id: 4
CustomLabel5:
id: 5
Button:
text: "Calculate values"
on_press: app.calculate_values(2,4)
<CustomLabel1@Label>:
<CustomLabel2@Label>:
<CustomLabel3@Label>:
<CustomLabel4@Label>:
<CustomLabel5@Label>: