按钮行为,由pyhton列表动态生成(纽扣)

时间:2019-03-26 21:36:03

标签: python kivy

最近几天,我花了很多时间在制作我想在与10英寸触摸屏相连的树莓派上实现的应用程序。我正在为德国的一个学生住房协会制作此应用程序。 因此,我们的想法是将带有触摸屏的树莓派安装在普通冰箱的上方/旁边(尚不确定)。冰箱仅容纳0.5L瓶装饮料,每瓶价格为0.80欧元至1.10€。我们不会立即付款,我们只是将完善的商品写下来。 我想要做的是一个带有kivy库的应用程序,在其中可以单击我的名字,喝一杯,该应用程序将节省我的消费,我已经支付的费用并将这些信息保存在CSV文件中。为此,我必须使用kivy动态生成许多按钮(列表中人的名字)。但是现在看来,当它们被按下时,我无法为其分配任何功能。更确切地说,每个按钮的索引似乎没有任何作用。我真的不知道如何解释它,所以让我们看一些代码:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

class grid(App):

    button = [0 for i in range(25)]

    def build(self):
        main = GridLayout(cols = 5)

        for i in range(25):
            self.button[i] = Button(text = str(i))
            self.button[i].bind(on_release =lambda x: grid.printString(str(i)))
            main.add_widget(self.button[i])

        return main

    def printString(string):
        print(string)


app = grid()
app.run()

所以这不是我的实际代码,这是一个说明问题的示例。对于每个单击的按钮,我得到的输出是24。我想要的是每个按钮在button []列表中打印出自己的索引。我一直在努力进行数小时的工作,但没有发现任何有效的方法。如果有人知道如何正确分配这些按钮行为,我将非常感谢您的投入。

1 个答案:

答案 0 :(得分:0)

  • 声明一个继承自Button小部件的CustomButton类
  • 使用on_touch_down事件并检查冲突
  • 创建CustomButton时分配id

示例

main.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout


class CustomButton(Button):

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print("Button.id=", self.id)
            return True
        return False


class grid(App):

    def build(self):
        main = GridLayout(cols=5)

        for i in range(25):
            button = CustomButton(id=str(i), text=str(i))
            main.add_widget(button)

        return main


app = grid()
app.run()