我想创建一组按钮来控制在同一current
中创建的for loop
屏幕。
我的.py文件
class Profiles(Screen):
#create button and screens based on items in acc_abr
def create_butt(self):
for i in acc_abr:
self.ids.sm.add_widget(Screen(name = i))
self.ids.pro.add_widget(Button(text=i, id=i, on_press = self.switching_function(screename=i)))
#set current screen
def switching_function(self, screename):
self.ids.sm.current = screename
我的.kv文件
<Profiles>:
name: "prof"
on_enter: self.create_butt()
BoxLayout:
orientation: "vertical"
GridLayout:
rows:1
id: pro
size_hint_y: .16
BoxLayout:
AccManagement:
id: sm
在create_butt
功能下,我为acc_abr
中的每个项目添加了一个屏幕和一个按钮(在适当的位置)。
问题是,当我尝试将on_press
绑定到switching_function
时。出于某种原因,当我运行kivy应用并致电Profile
时,我得到了AssertionError: None is not callable
on_press
命令的按钮可以更改屏幕管理器(sm)中的当前屏幕,如下所示:on_press: sm.current = "screen1"
我的最后一个问题是,这个写在python文件中吗?不起作用,但是Button(on_press=(self.ids.sm.current=i)
??? 答案 0 :(得分:2)
要在on_press
文件中使用.py
并传递参数,您需要使用lambda函数或functools.partial
。
from functools import partial
...
something.add_widget(Button(on_press = partial(self.switching_function, i))
...
这是因为on_press
仅希望调用函数的名称(请注意,在on_press回调中调用该函数时,没有括号)。