我对使用 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 代码。
我相信利用bind函数的解决方案(由Ender Look给出)会导致以下错误:
TypeError: pressed() takes 1 positional argument but 2 were given
要解决此问题,您必须允许 say_hello() 模块也接受触摸输入,尽管这不是必需的。
对于任何正在寻找纯 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"))
如果您想向 Kivy 中的任何元素添加功能,只需使用像这里这样的逻辑。
在您的 .py 文件中:
class LoginButton(Button):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.text = "Login"
def login(self):
print("logged_in")
然后在.kv文件中:
LoginButton:
id: "login"
on_press: self.login()
size_hint: None, None
size: 500, 50
pos_hint: {"center_x": 0.5}
它对我有用:)
kv 文件中以对象作为参数的函数
单位:
on_press: root.say_hello(self)
在py中:
def say_hello(self,obj):
print(obj)
您刚刚在 say_hello() 函数之前添加了 root。 像这样
on_press:
root.say_hello()
应该可以工作
从kivy.app导入App 从 kivy.uix.button 导入 Button
MyApp类(应用程序): def 构建(自身): return Button(text="你好,Kivy!", on_press=self.on_button_click)
def on_button_click(self, instance):
instance.text = "Button Pressed!"
if name == 'main': MyApp().run()