2016-08-24 4 views
0

Я пытаюсь добавить набор кнопок в вид прокрутки сетки, используя для цикла. Но событие нажимается для всех кнопок даже до нажатия кнопок. Как я могу это исправить?Кнопка нажимается до нажатия кнопки

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

потому, что вы на самом деле звоните обратный вызов при передаче арга:

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

Doc пример говорит:

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 обратного вызова вызывается с одним аргументом: виджет идентификатор. Это вызывает функцию lambda, которая вызывает btnsclicked, отбрасывая этот аргумент (который вам здесь не нужен), но передавая ваш текстовый идентификатор и 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) 
Смежные вопросы