如何将按钮绑定到在for循环中创建的屏幕?

时间:2019-02-23 02:26:49

标签: python-3.x kivy kivy-language

我想创建一组按钮来控制在同一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

  1. 是什么使它成为有效错误?
  2. 如何在for循环中将按钮正确绑定到屏幕?
  3. 在.kv文件中,带有on_press命令的按钮可以更改屏幕管理器(sm)中的当前屏幕,如下所示:on_press: sm.current = "screen1"我的最后一个问题是,这个写在python文件中吗?不起作用,但是Button(on_press=(self.ids.sm.current=i) ???

1 个答案:

答案 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回调中调用该函数时,没有括号)。