Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将函数绑定到kivy中动态创建的多个按钮? 问题_Python_Events_Kivy_Kivy Language - Fatal编程技术网

Python 将函数绑定到kivy中动态创建的多个按钮? 问题

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

我想创建多个按钮并将它们绑定到一个函数。问题是每当我点击一个按钮时,这个函数就会被调用多次。这似乎是事件连接的问题。当我看到当我按下一个按钮时调用该函数的实例时,似乎每个按钮都会同时调用该函数

KV代码: 示例输出: 当我点击一个按钮时,我得到了什么

<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]