私は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
.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ガイド で使用されています。
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()
say_hello
はLaunchクラスのメソッドです。 kvルールでは、Launchクラスはルートウィジェットであるため、root
キーワードを使用してアクセスできます。
on_press: root.say_hello()
また、名前を記述するだけでなく、実際に関数を呼び出す必要があることにも注意してください。コロンの右側はすべて正常ですPythonコード。
バインド関数(Ender Lookによって提供される)を使用するソリューションは、次のエラーにつながると思います。
TypeError: pressed() takes 1 positional argument but 2 were given
この問題を解決するには、say_hello()モジュールがタッチ入力も受け入れるようにする必要がありますが、必須ではありません。