使用动态ID从Python代码访问kivy小部件

时间:2018-06-01 22:02:01

标签: python widget kivy

我有一个带有几个小部件的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

原因是这个小部件列表可能会变大。我想访问的范围(切片)也可能不同。

1 个答案:

答案 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>: