【问题标题】:button on press being called before button press在按下按钮之前调用按下按钮
【发布时间】:2016-12-31 08:50:00
【问题描述】:

我正在尝试使用 for 循环将一组按钮添加到网格布局滚动视图。但是,即使在按下按钮之前,所有按钮都会触发 on press 事件。我该如何解决这个问题?

from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.app import runTouchApp
import webbrowser


def btnsclicked(id, url):
    print 'btn id '+id+' clicked'
    webbrowser.open(url)

layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
layout.bind(minimum_height=layout.setter('height'))

for i in range(5):
    url= 'https://www.google.com'
    btn = Button(text=str(i), size_hint_y=None, height=40, id='b'+str(i))
    btn.bind(on_press =btnsclicked('b'+str(i), url))
    layout.add_widget(btn)
root = ScrollView(size_hint=(1, None), size=(Window.width, Window.height))
root.add_widget(layout)

runTouchApp(root)

【问题讨论】:

    标签: python button event-handling kivy buttonclick


    【解决方案1】:

    对于on_press,您调用函数而不是指定要使用的函数。试试:

    btn.bind(on_press=lambda x: btnsclicked('b' + str(i), url))
    

    如果您想处理参数,请参阅Event dispatcher

    def btnsclicked(*args):
        id_, url = args
        print('btn id {} clicked'.format(id_))
        webbrowser.open(url)
    
    btn.bind(on_press=btnsclicked)
    

    【讨论】:

      【解决方案2】:

      因为你在传递参数时实际上是在调用你的回调:

      btn.bind(on_press =btnsclicked('b'+str(i), url))
      

      文档示例说:

      def callback(instance):
          print('The button <%s> is being pressed' % instance.text)
      btn1 = Button(text='Hello world 1')
      btn1.bind(on_press=callback)
      

      您必须传递一个只接受一个参数的函数(不是函数调用):激活的小部件的实例。

      使用定义内联函数的lambda 表达式执行此操作:

      btn.bind(on_press = lambda x : btnsclicked('b'+str(i), url))
      

      当一个事件被触发时,on_press 回调会被调用一个参数:widget id。这将调用您的 lambda 函数,该函数调用 btnsclicked 丢弃此参数(此处不需要),但传递您的文本 ID 和您要关联的 url。

      【讨论】:

      • 嗨,Jean,如何在不调用函数的情况下传递参数?
      • 通过使用作为中继函数的lamba表达式将回调连接到您的自定义回调。
      猜你喜欢
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多