【问题标题】:Kivy ids returns KeyError when assigning properties [duplicate]Kivy ids 在分配属性时返回 KeyError [重复]
【发布时间】:2018-11-29 19:26:26
【问题描述】:

我尝试在kivy 1.10.1 框架中创建一个函数,理论上该函数可以创建一组多个圆圈。它使用具有给定半径的参数形式计算球体中心的位置。在这种情况下,我希望字母表中的每个字母都有一个圆圈。我为每个字母创建了一个新的Letter 小部件,但每当它尝试添加位置属性时,它会返回一个带有任何键的KeyError: 'A'(我认为我在self.add_widget(Letter(id=letter)) 中分配了)我尝试获取。

Main.py:

from kivy.app import App
from kivy.uix.widget import Widget
import math
import string


class Letter(Widget):
    pass


class MainWidget(Widget):
    def __init__(self, **kwargs):
        super(MainWidget, self).__init__(**kwargs)

        theta = 0
        for letter in string.uppercase:
            coord_x = 100 * math.cos(theta)
            coord_y = 100 * math.sin(theta)

            self.add_widget(Letter(id=letter))
            self.ids[letter].center_x = coord_x
            self.ids[letter].center_y = coord_y

            theta += 360./float(len(string.uppercase))


class MainApp(App):
    def build(self):
        return MainWidget()


if __name__ == '__main__':
    MainApp().run()

Main.kv:

#:kivy 1.10.1

<Letter>:
    size: 50,50
    canvas:
        Color:
            rgb: 0,0,0
        Ellipse:
            pos: self.pos
            size: self.size

<MyWidget>:
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size

【问题讨论】:

    标签: python python-2.7 kivy


    【解决方案1】:

    self.ids 仅保存在 kv 中创建的小部件的 id。在 Python 中不需要它,因为您已经有了对小部件的方便引用:

    l = Letter()
    self.add_widget(l)
    l.center_x = coord_x
    l.center_y = coord_y
    

    【讨论】:

    • 但是要创建 Letter() 26 次,我必须写 l1 = Letter() l2 = Letter() l3 = Letter() ... l26 = Letter() 我尝试做的是使用 for 循环不必声明 26 次。
    • @Bruno l 是一个局部变量,它保持它的引用,以便在循环中它工作,你试过吗?如果您想使用这些小部件,则它将引用存储在列表或字典中
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多