2016-08-24 197 views
0

我想添加一組按鈕到網格佈局滾動視圖使用for循環。但即使在按下按鈕之前,所有按鈕都會觸發按下事件。我怎樣才能解決這個問題?按鈕被按下之前按下按

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) 

回答

1

,因爲你實際上是調用回調函數傳遞ARGS時:

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) 

你要通過只接受一個函數(而不是函數調用) 1個參數:激活小部件的實例。

做到這一點使用lambda表達式在線定義功能:

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

當一個事件被觸發時,on_press回調調用一個參數:控件ID。這稱爲你的lambda函數,它調用btnsclicked放棄這個參數(這裏你不需要),但是傳遞你的文本ID和你想要關聯的url。

+0

喜讓,我怎麼能傳遞參數,而不調用該函數? – SaikiHanee

+0

通過使用lamba表達式這是一箇中繼函數將回調連接到您的自定義回調。 –

+0

非常感謝你讓:) – SaikiHanee

2

對於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)