Python 将函数绑定到kivy中动态创建的多个按钮? 问题
我想创建多个按钮并将它们绑定到一个函数。问题是每当我点击一个按钮时,这个函数就会被调用多次。这似乎是事件连接的问题。当我看到当我按下一个按钮时调用该函数的实例时,似乎每个按钮都会同时调用该函数 KV代码: 示例输出: 当我点击一个按钮时,我得到了什么Python 将函数绑定到kivy中动态创建的多个按钮? 问题,python,events,kivy,kivy-language,Python,Events,Kivy,Kivy Language,我想创建多个按钮并将它们绑定到一个函数。问题是每当我点击一个按钮时,这个函数就会被调用多次。这似乎是事件连接的问题。当我看到当我按下一个按钮时调用该函数的实例时,似乎每个按钮都会同时调用该函数 KV代码: 示例输出: 当我点击一个按钮时,我得到了什么 <guiMain.ProjectSelectButton object at 0x0BA34260> ID01 right mouse clicked <guiMain.ProjectSelectButton object at
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA28F10>
ID02 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA28F10>
ID02 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA22C00>
ID03 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA22C00>
ID03 right mouse clicked
ID01鼠标右键单击
ID01鼠标右键单击
ID02鼠标右键单击
ID02鼠标右键单击
ID03鼠标右键单击
ID03鼠标右键单击
当我按下ID为01的按钮时,我想要什么:
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
ID01鼠标右键单击
问题:
如何创建多个按钮,当它们被按下时将调用单个功能?
默认情况下,触摸事件被发送到当前显示的所有小部件。这意味着小部件接收触摸事件,无论它是否发生在其物理区域内 为了提供最大的灵活性,Kivy将 事件,并让它们决定如何对它们作出反应。 如果您只想响应小部件内的触摸事件,您可以 简单地检查一下 解决方案 在单击按钮方法中使用
self.collide\u point
方法。当它碰撞时,你应该只得到一个按钮。有关详细信息,请参考我的示例
片段
例子
main.py
1.5千伏
#:kivy 1.10.0
:
字体大小:50
在触摸屏上:自我。在触摸屏上
:
行数:3
科尔斯:3
行\强制\默认值:True
行\默认\高度:150
col_force_默认值:True
颜色默认宽度:150
填充:[10]
间距:[10]
你能发布你的整个应用程序吗?还是太大了?它相当大,但我明天可以再添加一些代码。答案很有趣,所以我需要测试哪个按钮被“点击”?当我点击任何按钮时,所有按钮上都会触发该事件,但当我测试它是否发生碰撞时,我应该只得到一个按钮?默认情况下,触摸事件会发送到当前显示的所有小部件。这意味着小部件接收触摸事件,无论它是否发生在其物理区域内。Kivy将触摸事件发送给所有小部件,并让它们决定如何对其做出反应。如果您只想响应小部件/按钮内的触摸事件,则必须使用self.collide_point方法进行检查。当它发生碰撞时,你应该只得到一个按钮。谢谢,现在这更有意义了。最后,我的代码做了它应该做的!
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA28F10>
ID02 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA28F10>
ID02 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA22C00>
ID03 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA22C00>
ID03 right mouse clicked
<guiMain.ProjectSelectButton object at 0x0BA34260>
ID01 right mouse clicked
class ProjectSelectButton(Button):
def click_on_button(self, instance, touch, *args):
print(instance)
if self.collide_point(*touch.pos):
if touch.button == 'right':
print(self.id, "right mouse clicked")
elif touch.buttom == 'left':
print(self.id, "left mouse clicked")
return True
return super(ProjectSelectButton, self).on_touch_down(touch)
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
class CreateButton(Button):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
if touch.button == "right":
print(self.id, "right mouse clicked")
elif touch.button == "left":
print(self.id, "left mouse clicked")
else:
print(self.id)
return True
return super(CreateButton, self).on_touch_down(touch)
class OnTouchDownDemo(GridLayout):
def __init__(self, **kwargs):
super(OnTouchDownDemo, self).__init__(**kwargs)
self.build_board()
def build_board(self):
# make 9 buttons in a grid
for i in range(0, 9):
button = CreateButton(id=str(i))
self.add_widget(button)
class OnTouchDownApp(App):
def build(self):
return OnTouchDownDemo()
if __name__ == '__main__':
OnTouchDownApp().run()
#:kivy 1.10.0
<CreateButton>:
font_size: 50
on_touch_down: self.on_touch_down
<OnTouchDownDemo>:
rows: 3
cols: 3
row_force_default: True
row_default_height: 150
col_force_default: True
col_default_width: 150
padding: [10]
spacing: [10]