Python 3.x For循环中的kivy按钮事件

Python 3.x For循环中的kivy按钮事件,python-3.x,kivy,Python 3.x,Kivy,我希望在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',

我希望在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()
和千伏

    #:kivy 1.10

<LoopButton>
    Label:
        text: 'TEST'
    Button:
        id: 'affiche'
        text: 'afficher'
        on_press: root.aff()
    GridLayout:
        id: grid
        cols: 2
#:kivy 1.10
标签:
文本:“测试”
按钮:
身份证:“阿菲什”
文字:“阿菲彻”
按:root.aff()
网格布局:
id:网格
科尔斯:2
问题
on_press=webbrowser.open(url)
将在实例化/创建按钮小部件时打开webbrowser

解决方案 按回调方法创建一个
,并在回调方法中创建url

一小条

通常,属性回调使用2个参数调用(对象) 属性的新值)和带有一个参数的事件回调 (对象)

输出

问题
on_press=webbrowser.open(url)
将在实例化/创建按钮小部件时打开webbrowser

解决方案 按
回调方法创建一个
,并在回调方法中创建url

一小条

通常,属性回调使用2个参数调用(对象) 属性的新值)和带有一个参数的事件回调 (对象)

输出
on\u 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)
    

  • 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)
    

  • 你能澄清你的问题是什么吗?你能澄清你的问题是什么吗?