For循环中的kivy按钮事件

时间:2018-08-13 15:41:10

标签: 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', '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

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)

Event dispatcher » bind()

  

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

输出

Img01 Img02

答案 1 :(得分:1)

on_press希望您传递一个回调,并且您要将经过评估的函数传递给它,因此有3种可能的解决方案。

  1. 使用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))
                ...
    
  2. 使用lambda

    button = Button(text= w, on_press= lambda *args, url=url: webbrowser.open(url))
    
  3. 创建回调:

    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)