我非常擅长使用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
答案 0 :(得分:3)
.kv
这很简单,say_hello
属于Launch
类,因此要在.kv
文件中使用它,您必须编写root.say_hello
。请注意,say_hello
是您要执行的功能,因此您不必忘记()
---&gt; root.say_hello()
。
此外,如果say_hello
在App
课程中,您应该使用App.say_hello()
,因为它属于该应用。 (注意:即使您的App类为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
?对不起,不知道。但是你在the kivy guide中使用它。
答案 1 :(得分:1)
say_hello
是Launch类的一种方法。在您的kv规则中,Launch类是根小部件,因此可以使用root
关键字访问它:
on_press: root.say_hello()
另请注意,您必须实际调用该函数,而不仅仅是编写其名称 - 冒号右侧的所有内容都是普通的Python代码。
答案 2 :(得分:1)
我相信利用bind函数(由Ender Look提供)的解决方案将导致以下错误:
TypeError: pressed() takes 1 positional argument but 2 were given
要解决此问题,您必须允许say_hello()模块也接受触摸输入,尽管这不是必需的。
答案 3 :(得分:1)
对于任何正在寻找纯 Python 方法的人,这里是一个通用示例。
调用不带参数的函数:
def my_function(instance):
...
my_button.bind(on_press=my_function)
调用带参数的函数:
from functools import partial
def my_function(instance, myarg):
...
my_button.bind(on_press=partial(my_function,"a string"))
答案 4 :(得分:0)
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()
答案 5 :(得分:0)
您刚刚在say_hello()函数之前添加了root。 像这样
on_press:
root.say_hello()
它应该工作