我几天前开始制作我的第一个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
代替它,但是我喜欢我的按钮在点击一次时有不同的行为,而在点击两次时则不同。谢谢你的帮助。
答案 0 :(得分:2)
默认情况下,会将触摸事件分派给当前显示的所有内容 小部件。这意味着小部件接收触摸事件是否发生 在他们的物理区域内与否。
[...]
为了提供最大的灵活性,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)