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)