Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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 按下按钮前调用按下按钮上的按钮_Python_Button_Event Handling_Kivy_Buttonclick - Fatal编程技术网

Python 按下按钮前调用按下按钮上的按钮

Python 按下按钮前调用按下按钮上的按钮,python,button,event-handling,kivy,buttonclick,Python,Button,Event Handling,Kivy,Buttonclick,我正在尝试使用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 ru

我正在尝试使用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)

因为您在传递参数时实际上正在调用回调:

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)

触发事件时,按键调用的
回调将使用一个参数调用:小部件id。它调用调用
lambda
函数,该函数调用
btnsclicked
放弃此参数(此处不需要),但是传递文本id和要关联的url。

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

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)

触发事件时,会使用一个参数调用按
上的
回调:小部件id。它调用调用
lambda
函数,调用
btnsclicked
放弃此参数(此处不需要),但传递文本id和要关联的url。

对于按
上的
,调用函数,而不是指定要使用的函数。尝试:

btn.bind(on_press=lambda x: btnsclicked('b' + str(i), url))
如果要处理参数,请参阅:


对于按
键的
,可以调用函数,而不是指定要使用的函数。尝试:

btn.bind(on_press=lambda x: btnsclicked('b' + str(i), url))
如果要处理参数,请参阅:


hi Jean,我如何在不调用函数的情况下传递参数?通过使用lamba表达式(一个中继函数)将回调连接到自定义回调。hi Jean,我如何在不调用函数的情况下传递参数?通过使用lamba表达式(一个中继函数)将回调连接到自定义回调。