0

私はこのウィジェットを作りました:

<ImageButton>:
    source:''
    text:''
    release_fn: None
    Button:
        on_release: root.release_fn()
        size: root.size
        pos: root.pos
        BoxLayout:
            padding: 30
            size: self.parent.size
            pos: self.parent.pos
            orientation:'vertical'
            Image:
                id: img
                source: root.source
            Label:
                size_hint_y:.3
                text: root.text

ボタンが離されたときに呼び出される関数を渡したいのですが、その方法がわかりません(そして、答えが見つかりませんでした...)

以下は、最後の行の構文エラーのみを示しています(kivyファイルの残りの部分と正常に機能する部分は省略されています)

ImageButton:
    source: 'iconUsuario.png'
    text: 'Usuario'
    release_fn: print('HI!')


     print('HI!')
         ^
 SyntaxError: invalid syntax
4

2 に答える 2

1

Python は、なんらかの理由で、print を他の名前として使用することを好みません。これを実行してみてください:

def print():
    pass
def print:
    pass

常にSyntaxErrorat print . KV lang は基本的にこれを行います:

eval(print('bla'))

それでは、印刷用のラッパーを用意しましょう。いずれにせよ、おそらくピュア プリントは使用しないでしょう。次に、関数が return に気付くかもしれません。これは、最初の値がパーシャルのようにNone呼び出されるためです (関数を呼び出すと、実際に呼び出されます)。on_release: root.release_fn()release_fn: something()partial(func, arg)()

functools.partialそのため、すぐにではなく、ボタンが押された後に目的の場所で関数が呼び出されるように、もう一度インポートする必要があります。

on_release: root.release_fn()

例:

from kivy.app import App
from kivy.lang import Builder

kv = """
#:import partial functools.partial
ImageButton:
    release_fn: partial(app.prints, 'bla')

<ImageButton@ButtonBehavior+Image>:
    source:''
    text:''
    release_fn: None
    Button:
        on_release: root.release_fn()
        size: root.size
        pos: root.pos
        BoxLayout:
            padding: 30
            size: self.parent.size
            pos: self.parent.pos
            orientation:'vertical'
            Image:
                id: img
                source: root.source
            Label:
                size_hint_y:.3
                text: root.text
"""


class TestApp(App):
    def prints(self, value):
        print(value)

    def build(self):
        return Builder.load_string(kv)


if __name__ == '__main__':
    TestApp().run()
于 2017-01-04T02:02:09.793 に答える