繁体   English   中英

Python (Kivy) - 如何动态添加按钮和绑定不同的 arguments

[英]Python (Kivy) - How to dynamically add buttons and bind with different arguments

我已经了解了如何在 kivy 中动态添加按钮,以及如何将它们绑定到具有额外 arguments 的方法。

我将尝试使用 Car 示例尽可能好地描述我的问题:我有点使用 MVC。 用户应该能够看到汽车列表,他还能够编辑、添加和删除(基本的 CRUD)。 汽车 Model 具有 id、car_name 和 description 等属性

controller 执行 CRUD 操作。 写入时会将数据存储在 .json 文件中,读取时会将所有数据存储在变量中。 我对 Controller 或 Model 没有任何问题,这工作正常。

现在我想显示用户在我的视图 (Kivy) 中创建的所有汽车。 我决定所有汽车都将在主窗口中显示为带有汽车名称的按钮。 当我点击按钮时,它应该会显示一个包含汽车信息的新屏幕。 但我不知道如何从单击的按钮传递汽车的 id ......所以这就是我的代码到目前为止(不工作):

class MainWindow(GridLayout):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.cols = 1
        for car in car_cache.car_list:
            btn_car = Button(text=car.car_name, font_size=40)
            btn_car.bind(on_press=lambda x: self.select_car(btn_car, car.id))
            self.add_widget(btn_car)

    def select_car(self, instance, id):
        print(f'Car {id} selected')

按钮显示正确。 问题是,无论我点击什么按钮,它总是打印添加到小部件的汽车的最后一个 ID。

感谢您的帮助。

我的问题下的两条评论解决了我的问题。 对于第一条评论:

class MainWindow(GridLayout):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.cols = 1
        for car in car_cache.car_list:
            self.btn_car = Button(text=car.car_name, font_size=40)
            self.btn_car.bind(on_press=partial(self.select_car, car.id))
            self.add_widget(btn_car)

    def select_car(self, id, instance):
        print(f'Car {id} selected')

partial 需要从 functools 导入。 注意 function 'select_car' 中的参数 id 和 instance 发生了变化。

对于第二条评论:

class MainWindow(GridLayout):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.cols = 1
        for car in car_cache.car_list:
            self.btn_car = Button(text=car.car_name, font_size=40)
            self.btn_car.bind(on_press=lambda x, bound_car=car: 
                                self.select_car(self.btn_car, bound_car.id))
            self.add_widget(btn_car)

    def select_car(self, instance, id):
        print(f'Car {id} selected')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM