【问题标题】:Kivy returning AttributeError: object has no attribute 'name' when it clearly has itKivy 返回 AttributeError: object has no attribute 'name' when it clear has it
【发布时间】:2020-04-02 15:27:29
【问题描述】:

我正在尝试使用 Kivy 构建交互式学校时间表,但在根据名称更改 Button 文本时一直遇到问题。我创建了一个网格布局,其中每个按钮都有一个唯一的名称,例如星期一的第一个按钮是one_mon,下一个是two_mon,依此类推。我创建了一个继承自 Button 的类,这里是该类的 Kivy 和 Python 代码:

<Tile>:
    background_color: [.5, .9, 1, 1]
    halign: "center"
    size_hint: None, None
    size: 96, 96
    text: self.lesson
    on_press: self.on_press()
    on_release: self.on_release()

这是 Tile 的 Python 代码


class Tile(Button):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.lesson = ""
        self.sub_press = ""
        self.check()
        self.text = self.lesson

    def check(self):
        if self.name == "one_mon":
            self.text = "English"
            self.sub_press = "Room nr. 42 \n Mr. Hetman"

        ...        

        else:
            self.lesson = "None"
            self.sub_press = "None"

    def on_release(self):
        self.text = self.lesson
        self.background_color = [.5, .9, 1, 1]

    def on_press(self):
        self.text = self.sub_press
        self.background_color = [.01, .9, 1, 1]

Tile 类的on_press 函数下使用print(self.name) 可以正常工作并返回按钮的名称,但使用if self.name == "one_mon" 会引发AttributeError 'Tile' object has no attribute 'name'

以下是将所有这些按钮放在一起的父小部件的代码:

<PlanChart>:
    cols: 11
    padding: 2
    Tile:
        id: one_mon
        name: "one_mon"
    Tile:
        id: two_mon
        name: "two_mon"
    Tile:
        id: three_mon
        name: "three_mon"

    ......

    Tile:
        id: ten_fri
        name: "ten_fri"

如何根据按钮的 ID 或名称为按钮分配不同的文本?我不能只将文本单独分配给每个按钮,因为将来我希望能够切换时间表可能看起来不同的不同学生。

【问题讨论】:

    标签: python user-interface kivy


    【解决方案1】:

    当您执行self.name 时,它会在class 中搜索变量name(未声明)

    为了从 kv 代码中访问 id,您需要执行以下操作

    if self.ids.one_mon.name == "one_mon"
    

    希望对你有帮助

    【讨论】:

    • 我试过了,还是不行 :// 这里是错误码if self.ids.one_mon.name == "one_mon": File "kivy\properties.pyx", line 863, in kivy.properties.ObservableDict.__getattr__ AttributeError: 'super' object has no attribute '__getattr__'
    猜你喜欢
    • 2022-12-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多