我在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())
我没有收到错误消息,但什么也没发生。
1条答案
按热度按时间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
中的小部件。下面是一个修改过的代码版本,它可以做到这一点:lab.kv:
kv
中的grid_id.doet()
使用定义的id
访问实际上在App
中的Grid
。