Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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/Kivy:如何在循环中传递参数_Python_Kivy_Kivy Language - Fatal编程技术网

Python/Kivy:如何在循环中传递参数

Python/Kivy:如何在循环中传递参数,python,kivy,kivy-language,Python,Kivy,Kivy Language,我有两个文件test.py和test.kv。当我运行test.py并单击show按钮,然后显示标签和值。 当我点击任何标签(Item1、Item2、Item3)时,在def say_hello 有人能告诉我我在哪里犯了错误吗 test.py 试验电压(千伏) : 字体大小:15 字体名称:“Verdana” 尺寸提示:无 身高:30 : 字体大小:15 字体名称:“Verdana” 尺寸提示:无 身高:30 文本大小:self.size valign:“中间” 在以下情况之前: 颜色: rgb:

我有两个文件
test.py
test.kv
。当我运行
test.py
并单击
show
按钮,然后显示标签和值。
当我点击任何
标签(Item1、Item2、Item3)
时,在
def say_hello

有人能告诉我我在哪里犯了错误吗

test.py 试验电压(千伏)
:
字体大小:15
字体名称:“Verdana”
尺寸提示:无
身高:30
:
字体大小:15
字体名称:“Verdana”
尺寸提示:无
身高:30
文本大小:self.size
valign:“中间”
在以下情况之前:
颜色:
rgb:.6、.6、.6
矩形:
pos:self.pos
大小:self.size
发票:
盒子布局:
方向:“垂直”
填充:15,15
盒子布局:
方向:“垂直”
填充:5,5
大小提示:.6,无
位置提示:{'x':.18,}
盒子布局:
方向:“水平”
填充:5,5
间距:10,10
尺码:800,40
大小提示:1,无
按钮:
文字:“显示”
尺寸提示:0.05
间距x:30
on_press:root.abc()
盒子布局:
方向:“水平”
大小提示:1,1
盒子布局:
方向:“垂直”
大小提示:.5,1
填充:0,15
间距:10,10
尺寸:500,30
网格布局:
id:发票
科尔斯:2
#方向:“水平”
填充:5,0
间距:10,0
#尺寸:500,30
大小提示:1,1
pos:self.pos
大小:self.size

问题在于您正在覆盖lambda函数的值,解决方案是将该值作为lambda函数的参数传递:

蟒蛇3:

layout.add_widget(MyLabel(text=str('[ref=world]'+row[1])+'[/ref]',
    size_hint_x=.35, 
    halign='left', 
    markup=True,
    on_ref_press=lambda *args, _id=row[0]: self.say_hello(_id) ))
前面的方法适用于python3,python2存在语法错误,因此我们将使用
函数。partial

from functools import partial

[...]

def abc(self):
    #fetching from database
    arr = [(11, 'Item1', '1001'), (12, 'Item2', '2001'), (13, 'Item3', '102')]
    layout = self.ids['invoices']
    for row in arr:
        layout.add_widget(MyLabel(text=str('[ref=world]'+row[1])+'[/ref]', 
            size_hint_x=.35, 
            halign='left', 
            markup=True,
            on_ref_press=partial(self.say_hello, row[1])))
        layout.add_widget(MyLabel(text=str(row[2]),size_hint_x=.15, halign='right' ))

def say_hello(self, id, *args):
    print(id)

它显示
SyntaxError:id=row[0]的无效语法。很抱歉给您带来不便。我正在使用python-2。7@Yash试试第二种方法。
layout.add_widget(MyLabel(text=str('[ref=world]'+row[1])+'[/ref]',
    size_hint_x=.35, 
    halign='left', 
    markup=True,
    on_ref_press=lambda *args, _id=row[0]: self.say_hello(_id) ))
from functools import partial

[...]

def abc(self):
    #fetching from database
    arr = [(11, 'Item1', '1001'), (12, 'Item2', '2001'), (13, 'Item3', '102')]
    layout = self.ids['invoices']
    for row in arr:
        layout.add_widget(MyLabel(text=str('[ref=world]'+row[1])+'[/ref]', 
            size_hint_x=.35, 
            halign='left', 
            markup=True,
            on_ref_press=partial(self.say_hello, row[1])))
        layout.add_widget(MyLabel(text=str(row[2]),size_hint_x=.15, halign='right' ))

def say_hello(self, id, *args):
    print(id)