我正在寻找在for循环中创建按钮的方法。我的问题是在on_press属性上。 我读了有关闭包的东西(如果那是问题)。但是我不是很明白。
有点帮助。谢谢英语。
.py代码:
import kivy
import webbrowser
from kivy.app import App
from kivy.uix.button import Label, Button
from kivy.uix.boxlayout import BoxLayout
word_list = ['one', 'two', 'three', 'four']
class LoopButton(BoxLayout):
def aff(self):
for w in word_list:
url = 'https://fr.wiktionary.org/wiki/' + w
button = Button(text= w, on_press= webbrowser.open(url))
self.ids.grid.add_widget(button)
class TestApp(App):
def build(self):
return LoopButton()
if __name__ == '__main__':
TestApp().run()
和.kv
#:kivy 1.10
<LoopButton>
Label:
text: 'TEST'
Button:
id: 'affiche'
text: 'afficher'
on_press: root.aff()
GridLayout:
id: grid
cols: 2
答案 0 :(得分:1)
on_press=webbrowser.open(url)
将在实例化/创建Button小部件时打开Web浏览器。
创建一个on_press
回调方法并在该回调方法中创建url
class LoopButton(BoxLayout):
def aff(self):
for w in word_list:
button = Button(text=w, on_press=self.open_webbrowser)
self.ids.grid.add_widget(button)
def open_webbrowser(self, instance):
url = 'https://fr.wiktionary.org/wiki/' + instance.text
webbrowser.open(url)
通常, 属性回调 使用 2个参数 (对象 以及属性的新值)和 事件回调 ,并带有 一个参数 (对象)。
答案 1 :(得分:1)
on_press希望您传递一个回调,并且您要将经过评估的函数传递给它,因此有3种可能的解决方案。
使用functools.partial
:
import kivy
import webbrowser
from functools import partial
...
class LoopButton(BoxLayout):
def aff(self):
for w in word_list:
url = 'https://fr.wiktionary.org/wiki/' + w
button = Button(text= w, on_press=partial(webbrowser.open, url))
...
使用lambda
:
button = Button(text= w, on_press= lambda *args, url=url: webbrowser.open(url))
创建回调:
class LoopButton(BoxLayout):
def aff(self):
for w in word_list:
button = Button(text= w, on_press=self.callback)
self.ids.grid.add_widget(button)
def callback(self, instance):
url = 'https://fr.wiktionary.org/wiki/' + instance.text
webbrowser.open(url)