1. <legend id='T3VTh'><style id='T3VTh'><dir id='T3VTh'><q id='T3VTh'></q></dir></style></legend>

    <i id='T3VTh'><tr id='T3VTh'><dt id='T3VTh'><q id='T3VTh'><span id='T3VTh'><b id='T3VTh'><form id='T3VTh'><ins id='T3VTh'></ins><ul id='T3VTh'></ul><sub id='T3VTh'></sub></form><legend id='T3VTh'></legend><bdo id='T3VTh'><pre id='T3VTh'><center id='T3VTh'></center></pre></bdo></b><th id='T3VTh'></th></span></q></dt></tr></i><div id='T3VTh'><tfoot id='T3VTh'></tfoot><dl id='T3VTh'><fieldset id='T3VTh'></fieldset></dl></div>

      <bdo id='T3VTh'></bdo><ul id='T3VTh'></ul>

    <small id='T3VTh'></small><noframes id='T3VTh'>

    <tfoot id='T3VTh'></tfoot>
    1. 将函数绑定到kivy中的多个动态创建的按钮?

      时间:2023-10-09

      <small id='Yc1YT'></small><noframes id='Yc1YT'>

        <tbody id='Yc1YT'></tbody>

        <legend id='Yc1YT'><style id='Yc1YT'><dir id='Yc1YT'><q id='Yc1YT'></q></dir></style></legend>
          <bdo id='Yc1YT'></bdo><ul id='Yc1YT'></ul>
          <i id='Yc1YT'><tr id='Yc1YT'><dt id='Yc1YT'><q id='Yc1YT'><span id='Yc1YT'><b id='Yc1YT'><form id='Yc1YT'><ins id='Yc1YT'></ins><ul id='Yc1YT'></ul><sub id='Yc1YT'></sub></form><legend id='Yc1YT'></legend><bdo id='Yc1YT'><pre id='Yc1YT'><center id='Yc1YT'></center></pre></bdo></b><th id='Yc1YT'></th></span></q></dt></tr></i><div id='Yc1YT'><tfoot id='Yc1YT'></tfoot><dl id='Yc1YT'><fieldset id='Yc1YT'></fieldset></dl></div>
          1. <tfoot id='Yc1YT'></tfoot>
                本文介绍了将函数绑定到kivy中的多个动态创建的按钮?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

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

                I want to create multiple buttons and bind them to a function. The problem is that whenever I click on one button, the function is called multiple times. It seems to be a problem with the event connection. When I look at the instance that called the function when I pressed a button, it seems that the function gets called from every button at once?!

                ...
                # This is the button that I'am using
                <ProjectSelectButton>:
                height: 35
                background_color: 0,0,1,1
                on_touch_down: self.click_on_button(args[0], args[1])
                
                ...
                
                # The buttons are added to this grid
                ButtonsPlacedHere@GridLayout:
                    id: active_projects
                    cols: 1
                    size_hint_y: None
                    height: self.minimum_height
                    spacing: 1
                ...
                

                Python 代码:

                ...
                class ProjectSelectButton(Button):
                    def click_on_button(self, instance, touch, *args):
                        print(instance)
                        if touch.button == 'right':
                            print(self.id, "right mouse clicked")
                        else touch.buttom == 'left':
                            print(self.id, "left mouse clicked")
                
                ...
                
                # The part of my programm that creates the buttons
                # projects is a dictionary
                for key, project in data_manager.resource_pool.projects.items():
                    print(project.project_name)
                    button= ProjectSelectButton(text=project.project_name, id=key, size_hint_y=None)
                    # Bind without KV-File (same result)
                    # label.bind(on_touch_up=self.click_on_button)
                    ids.active_projects.add_widget(button)
                

                示例输出:

                当我点击一个按钮时,我得到了什么!

                Example Output:

                What I get, when I click on a single button!

                <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
                

                当我按下 ID 为 01 的按钮时我想要什么:

                What I want when I press for example the button with ID 01:

                <guiMain.ProjectSelectButton object at 0x0BA34260>
                ID01 right mouse clicked
                

                问题

                如何创建多个按钮,当它们被按下时会调用一个函数?

                Question

                How do I create multiple buttons which will call a single function when they are pressed?

                推荐答案

                编程指南 » 输入管理 » 触摸事件

                默认情况下,触摸事件会分派给所有当前显示的小部件.这意味着无论是否发生在其物理区域内,小部件都会接收到触摸事件.

                By default, touch events are dispatched to all currently displayed widgets. This means widgets receive the touch event whether it occurs within their physical area or not.

                为了提供最大的灵活性,Kivy 调度所有小部件的事件,并让它们决定如何对它们做出反应.如果您只想响应小部件内的触摸事件,您简单检查一下.

                In order to provide the maximum flexibility, Kivy dispatches the events to all the widgets and lets them decide how to react to them. If you only want to respond to touch events inside the widget, you simply check.

                解决方案

                click_on_button 方法中使用 self.collide_point 方法.当它碰撞时,你应该只得到一个按钮.详情请参考我的例子.

                Solution

                Use self.collide_point method in click_on_button method. When it collides, you should get only one button. Please refer to my example for details.

                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)
                

                示例

                main.py

                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()
                

                ontouchdown.kv

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

                这篇关于将函数绑定到kivy中的多个动态创建的按钮?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:获取kivy中选中复选框的值 下一篇:如何在 Kivy Python 中显示数学文本?

                相关文章

                最新文章

                  <tfoot id='TUI2i'></tfoot>

                  <small id='TUI2i'></small><noframes id='TUI2i'>

                  1. <i id='TUI2i'><tr id='TUI2i'><dt id='TUI2i'><q id='TUI2i'><span id='TUI2i'><b id='TUI2i'><form id='TUI2i'><ins id='TUI2i'></ins><ul id='TUI2i'></ul><sub id='TUI2i'></sub></form><legend id='TUI2i'></legend><bdo id='TUI2i'><pre id='TUI2i'><center id='TUI2i'></center></pre></bdo></b><th id='TUI2i'></th></span></q></dt></tr></i><div id='TUI2i'><tfoot id='TUI2i'></tfoot><dl id='TUI2i'><fieldset id='TUI2i'></fieldset></dl></div>
                  2. <legend id='TUI2i'><style id='TUI2i'><dir id='TUI2i'><q id='TUI2i'></q></dir></style></legend>
                    • <bdo id='TUI2i'></bdo><ul id='TUI2i'></ul>