我在MacOs上有這個Python 3腳本:
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類中的一個小部件添加到網(wǎng)格中,但它不起作用。我收到以下錯誤消息:
AttributeError: 'super' object has no attribute '__getattr__'
附言:我也試過了:
self.add_widget(Button())
我沒有收到錯誤消息,但什么也沒發(fā)生。
您的代碼有幾個問題:
doet()
方法試圖引用Grid
類的ids
,但Grid
類沒有ids
。在您的kv
中定義的ids
在BoxLayout
類中。請參閱文檔。kv
中的代碼:on_press:app.grid.doet()
調(diào)用app
類的grid
屬性的doet()
方法。該grid
屬性是由build()
方法(self.grid=Grid()
)定義的,并且不包括在app
顯示中,因此運行其方法不會對您看到的內(nèi)容產(chǎn)生影響。修復(fù)方法是消除未使用的小部件,并正確訪問
App
中實際存在的小部件。這是您的代碼的修改版本,可以做到這一點:lab.kv:
kv
中的grid_id.doet()
使用定義的id
來訪問App
中實際存在的Grid
。