Kivy按钮没有按预期工作

时间:2017-08-18 12:36:08

标签: python kivy

我几天前开始制作我的第一个kivy应用程序,一切都很好,直到一点。

我有一个标签,里面有GridLayout,256个按钮(PaletteColorButton)应该代表调色板。我为这个类创建了一个on_touch_down方法,并尝试点击任何按钮,它们都执行on_touch_down内的内容。

这是我的代码中最重要的部分:

class PaletteLabel(ToolBarLabel):
    def make_palette(self, layout):
        for i in range(0, 256):
            palette_color_button = PaletteColorButton()
            with palette_color_button.canvas:
                Color(i/255, i/255, i/255, 1)
            layout.add_widget(palette_color_button)


class PaletteColorButton(Button):

    def on_touch_down(self, touch):
        if touch.is_double_tap:
            print(self.pos)


class BamEditor(App):
    Config.set('kivy', 'window_icon', r'.\static\program_icon\BamEditor-icon.png')
    def build(self):
        main_label = MainLabel()
        main_label.ids['palettelabel'].make_palette(main_label.ids['palettelayout'])
        return main_label

这里是来自.kv文件的数据:

<PaletteLabel>:
    height: 160
    width: 640


<PaletteColorButton>:
    size:(20,20)
    canvas.after:
        Rectangle:
            pos: self.x + 1 , self.y + 1
            size: self.width - 2, self.height - 2
<MainLabel>:
    PaletteLabel:
        id: palettelabel
        pos: (self.parent.x + 120, self.parent.y + 20)

        GridLayout:
            id: palettelayout
            cols: 32
            rows: 8

            pos: self.parent.x , self.parent.y
            size: self.parent.width, self.parent.height 

我想只打印单击的按钮pos,但我获得了所有256个按钮的位置,是否有人知道如何实现这一目标? Ofc,我可以使用on_press代替它,但是我喜欢我的按钮在点击一次时有不同的行为,而在点击两次时则不同。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

来自kivy编程指南:

  

默认情况下,会将触摸事件分派给当前显示的所有内容   小部件。这意味着小部件接收触摸事件是否发生   在他们的物理区域内与否。

     

[...]

     

为了提供最大的灵活性,Kivy发送了   所有小部件的事件,让他们决定如何对它们做出反应。   如果您只想响应窗口小部件中的触摸事件,那么   只需检查:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

https://kivy.org/docs/guide/inputs.html#touch-events

如果您不想在此按钮中管理触摸,(因此当碰撞测试失败时),您应该将事件调度到小部件树的其余部分

    return super(WidgetClass, self).on_touch_down(touch)