KivyMD:无法绑定函数
KivyMD: can't bind function
我正在生成多个按钮,我想将每个按钮 on_release
事件和每个按钮 return 一个唯一 ID 绑定到分配的函数,这是我的全部代码:-
class APP(MDApp):
class MovieScreen(Screen):
def on_enter(self, *args):
pass
def addMoreMovies(self, imdbid):
print(imdbid)
Config.set('graphics', 'width', '450')
Config.set('graphics', 'height', '700')
Config.write()
def build(self):
self.theme_cls = ThemeManager()
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Dark"
screen = Builder.load_string(screen_helper)
return screen
def on_start(self):
amountOfMovies = 10
movies = getMovie(amountOfMovies)
for i in range(len(movies[0])):
image = movies[1][i]
name = movies[0][i]
imdbid = movies[2][i]
tile=SmartTileWithLabel()
tile.id=str(imdbid)
tile.bind(on_release=lambda x: APP.addMoreMovies(self,imdbid=imdbid))
tile.source=str(image)
tile.text=str(name)
tile.size=(182,268)
tile.height='240dp'
tile.size_hint_y=None
self.root.ids.grid.add_widget(tile)
代码有点用,但所有按钮都是return最后分配的 ID,
我意识到我必须更改我的代码
tile.bind(on_release=lambda x: APP.addMoreMovies(self,imdbid=imdbid))
到
tile.bind(on_release=APP.addMoreMovies(self,imdbid=imdbid))
这样每个按钮实例都有自己的功能。但是当我 运行 代码时,我得到以下错误:-
File "kivy\_event.pyx", line 419, in kivy._event.EventDispatcher.bind
AssertionError: None is not callable
on_release=
需要不带 ()
(且不带参数)的函数名称,因此当您按下按钮时,它会使用 ()
来执行它。
如果你使用
on_release=APP.addMoreMovies()
然后你在开始时执行函数,它的工作方式类似于
result = APP.addMoreMovies()
bind(on_release=result)
但是 APP.addMoreMovies()
returns None
所以你
result = None # APP.addMoreMovies()
bind(on_release=result)
这给出了
bind(on_release=None)
所以你错了None is not callable
您应该保留 lambda
的版本,但您可能需要以不同的方式发送 imdb
bind(on_release=lambda x, value=imdbid: APP.addMoreMovies(self,imdbid=value))
然后每个按钮都应该使用自己的值
我正在生成多个按钮,我想将每个按钮 on_release
事件和每个按钮 return 一个唯一 ID 绑定到分配的函数,这是我的全部代码:-
class APP(MDApp):
class MovieScreen(Screen):
def on_enter(self, *args):
pass
def addMoreMovies(self, imdbid):
print(imdbid)
Config.set('graphics', 'width', '450')
Config.set('graphics', 'height', '700')
Config.write()
def build(self):
self.theme_cls = ThemeManager()
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Dark"
screen = Builder.load_string(screen_helper)
return screen
def on_start(self):
amountOfMovies = 10
movies = getMovie(amountOfMovies)
for i in range(len(movies[0])):
image = movies[1][i]
name = movies[0][i]
imdbid = movies[2][i]
tile=SmartTileWithLabel()
tile.id=str(imdbid)
tile.bind(on_release=lambda x: APP.addMoreMovies(self,imdbid=imdbid))
tile.source=str(image)
tile.text=str(name)
tile.size=(182,268)
tile.height='240dp'
tile.size_hint_y=None
self.root.ids.grid.add_widget(tile)
代码有点用,但所有按钮都是return最后分配的 ID,
我意识到我必须更改我的代码
tile.bind(on_release=lambda x: APP.addMoreMovies(self,imdbid=imdbid))
到
tile.bind(on_release=APP.addMoreMovies(self,imdbid=imdbid))
这样每个按钮实例都有自己的功能。但是当我 运行 代码时,我得到以下错误:-
File "kivy\_event.pyx", line 419, in kivy._event.EventDispatcher.bind
AssertionError: None is not callable
on_release=
需要不带 ()
(且不带参数)的函数名称,因此当您按下按钮时,它会使用 ()
来执行它。
如果你使用
on_release=APP.addMoreMovies()
然后你在开始时执行函数,它的工作方式类似于
result = APP.addMoreMovies()
bind(on_release=result)
但是 APP.addMoreMovies()
returns None
所以你
result = None # APP.addMoreMovies()
bind(on_release=result)
这给出了
bind(on_release=None)
所以你错了None is not callable
您应该保留 lambda
的版本,但您可能需要以不同的方式发送 imdb
bind(on_release=lambda x, value=imdbid: APP.addMoreMovies(self,imdbid=value))
然后每个按钮都应该使用自己的值