我无法在python3类的kivy应用程序中添加小部件,错误信息:属性错误:“super”对象没有属性“__getattr__”

wztqucjr  于 2023-05-08  发布在  Python
关注(0)|答案(1)|浏览(111)

我在MacOS上有这个Python3脚本:

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
class Grid(GridLayout):
    cols=2
    def doet(self):
        self.ids.grid_id.add_widget(Button())
class app(App):
    def build(self):
        self.grid=Grid()
        return Builder.load_file('lab.kv')
app().run()

这个kv文件(lab.kv):

BoxLayout:
    Button:
        text:'Doet'
        on_press:app.grid.doet()
    Grid:
        id:grid_id

我尝试通过单击按钮从python类向网格添加一个小部件,但它不起作用。我得到这个错误消息:

AttributeError: 'super' object has no attribute '__getattr__'

PS:我也试过了:

self.add_widget(Button())

我没有收到错误消息,但什么也没发生。

fwzugrvs

fwzugrvs1#

你的代码有几个问题:

  • 您的doet()方法尝试引用Grid类的ids,但Grid类没有ids。在kv中定义的ids属于BoxLayout类。参见文档。
  • kv中的代码:on_press:app.grid.doet()调用app类的grid属性的doet()方法。该grid属性是在build()方法(self.grid=Grid())中定义的,并且不包含在app显示中,因此运行其方法不会对您看到的内容产生影响。

修复方法是消除未使用的小部件,并正确访问实际存在于App中的小部件。下面是一个修改过的代码版本,它可以做到这一点:

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

class Grid(GridLayout):
    cols=2
    def doet(self):
        self.add_widget(Button())  # add new Button to the Grid

class app(App):
    def build(self):
        # self.grid=Grid()
        return Builder.load_file('lab.kv')

app().run()

lab.kv:

BoxLayout:
    Button:
        text:'Doet'
        on_press: grid_id.doet()
    Grid:
        id:grid_id

kv中的grid_id.doet()使用定义的id访问实际上在App中的Grid

相关问题