web-dev-qa-db-ja.com

Python Kivy:ボタンクリックで関数を呼び出す方法は?

私はkivyライブラリを使うのはかなり新しいです。

App.pyファイルとapp.kvファイルがありますが、ボタンを押しても関数を呼び出せないという問題があります。

app.py:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class Launch(BoxLayout):
    def __init__(self, **kwargs):
        super(Launch, self).__init__(**kwargs)

    def say_hello(self):
        print "hello"


class App(App):
    def build(self):
        return Launch()


if __name__ == '__main__':
    App().run()

app.kv:

#:kivy 1.9.1

<Launch>:
    BoxLayout:
        Button:
            size:(80,80)
            size_hint:(None,None)
            text:"Click me"
            on_press: say_hello
4
Mike Delta

モード:_.kv_

非常に簡単です。_say_hello_はLaunchクラスに属しているため、_.kv_ファイルで使用するには、_root.say_hello_を記述する必要があります。 _say_hello_は実行したい関数なので、_()_ ---> root.say_hello()を忘れる必要はありません。

また、_say_hello_がAppクラスにある場合は、アプリに属しているため、App.say_hello()を使用する必要があります。 (注:アプリクラスがclass MyFantasicApp(App):であっても、常にApp.say_hello()またはapp.say_hello()になります。覚えていません。申し訳ありません)。

_#:kivy 1.9.1

<Launch>:
    BoxLayout:
        Button:
            size:(80,80)
            size_hint:(None,None)
            text:"Click me"
            on_press: root.say_hello()
_

モード:_.py_

関数をbindできます。

_from kivy.uix.button import Button # You would need futhermore this
class Launch(BoxLayout):
    def __init__(self, **kwargs):
        super(Launch, self).__init__(**kwargs)
        mybutton = Button(
                            text = 'Click me',
                            size = (80,80),
                            size_hint = (None,None)
                          )
        mybutton.bind(on_press = self.say_hello) # Note: here say_hello doesn't have brackets.
        Launch.add_widget(mybutton)

    def say_hello(self):
        print "hello"
_

なぜbindを使用するのですか?すみません、わかりません。しかし、あなたはそれが kivyガイド で使用されています。

6
Ender Look
from kivy.app import App

from kivy.uix.button import Button

from kivy.uix.label import Label

class Test(App):

def press(self,instance):
    print("Pressed")
def build(self):
    butt=Button(text="Click")
    butt.bind(on_press=self.press) #dont use brackets while calling function
    return butt

Test().run()
2
R Yeshwanth

say_helloはLaunchクラスのメソッドです。 kvルールでは、Launchクラスはルートウィジェットであるため、rootキーワードを使用してアクセスできます。

on_press: root.say_hello()

また、名前を記述するだけでなく、実際に関数を呼び出す必要があることにも注意してください。コロンの右側はすべて正常ですPythonコード。

2
inclement

バインド関数(Ender Lookによって提供される)を使用するソリューションは、次のエラーにつながると思います。

TypeError: pressed() takes 1 positional argument but 2 were given

この問題を解決するには、say_hello()モジュールがタッチ入力も受け入れるようにする必要がありますが、必須ではありません。

0
D. Tulloch