章节知识点总揽
4.1 Button按钮
4.1.1 使用方法
Kviy中的Button控件常用于在Python应用程序中添加按钮,在按钮上可以放置文本或图像,也可以监听用户行为等。
实例:设置Button按钮的使用方法
在.py文件内,使用按钮需要引入Button类,通过Button类生成一个按钮,再通过add_widget()方法添加到布局中即可,具体关键代码如下:
#导入控件
from kivy.uix.button import Button
#指定属性
bt = Button(text='Button 01')
#添加到布局中
self.add_widget(bt)
结合第二章布局知识,使用BoxLayout布局制作一个只有一个按钮的界面布局,代码如下:
#导入app类
from kivy.app import App
#导入布局类
from kivy.uix.boxlayout import BoxLayout
#导入控件
from kivy.uix.button import Button
class BoxLayoutWidget(BoxLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
#指定属性
bt = Button(text='Button 01')
#添加到布局中
self.add_widget(bt)
class BoxApp(App):
def build(self):
return BoxLayoutWidget()
if __name__=='__main__':
BoxApp().run()
当然也可以像第二章一样,使用.kv文件实现。相比之下,在.kv文件内使用它就非常简单,无需引入即可直接使用,具体关键代码如下:
Button:
text:'Button 02'
为了在.kv文件中实现上述功能,修改main.py文件,删除布局内容部分,具体如下:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
#布局类
class BoxLayoutWidget(BoxLayout):
#初始化
def __init__(self,**kwargs):
super().__init__(**kwargs)
class BoxApp(App):
#实现App类的build()方法(继承自App类)
def build(self):
#返回根控件
return BoxLayoutWidget()
if __name__ == '__main__':
#启动程序
BoxApp().run()
根据main.py文件中定义的BoxApp类名字,对应的新建Box.kv文件,内容如下:
<BoxLayoutWidget>:
Button:
text:'Button 02'
执行main.py文件,即可获得上述效果
注意:如果未指定按钮的位置和大小,在运行程序时,Kivy会自动放大根控件,并使整个按钮充满窗口。另外由于.py优先级更高,因此会覆盖掉上述代码中的“Button 02”按钮。
4.1.2 常用属性
为了美观,Kivy提供了Button按钮常用的属性来改变样式,关于Button按钮的常用属性及说明如下所示:
属 性 | 说 明 |
background_color | 按钮背景颜色,rgba格式,默认为灰色 |
text | 按钮显示的文本 |
font_size | 文本字体大小,默认为15sp |
color | 文本字体颜色,rgba格式,默认为白色[1,1,1,1] |
state | 按钮状态,默认为“normal”,可设置成“down” |
disabled | 如果为True时则禁用按钮,默认为False |
background_disabled_down | 默认为“Kivy/tools/theming/defaulttheme/button_disabled_pressed.png”属性 |
background_disabled_normal | 默认为“Kivy/tools/theming/defaulttheme/button_disabled.png”属性 |
background_down | 按下按钮时显示的图像,默认为“kivy/tools/theming/defaulttheme/button_pressed.png”属性 |
background_normal | 按下按钮时显示的图像,默认为“kivy/tools/theming/defaulttheme/button.png”属性 |
border | 与background_normal和background_down属性一起使用,可以用于自定义背景 |
实例:设置Button按钮的常用属性
新建一个main.py文件,用于加载button.kv文件,代码如下:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class ButtonFloatLayout(FloatLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
class ButtonApp(App):
def build(self):
return ButtonFloatLayout()
if __name__ == '__main__':
ButtonApp().run()
这里将在button.kv文件内演示Button的属性,具体代码如下:
<MyButton@Button>
size_hint:.2,.15
<ButtonFloatLayout>:
Button:
text:'Button 00'
size_hint:.2,.15
pos:65,400
background_normal:''
background_color:[.1,.5,.5,1]
MyButton:
text:'Button01'
pos:315,400
disabled:True
MyButton:
text:'Button 02'
color:[.8,.3,.3,1]
pos:565,400
MyButton:
text:'Button 03'
font_size:15
pos:65,150
MyButton:
text:'Button 04'
font_size:25
pos:315,150
state:'normal'
MyButton:
text:'Button 05'
pos:565,150
state:'down'
运行main.py文件,结果如下图:
注意:Kivy不能识别.kv文件内的中文编码,直接添加中文时会抱错,如果学要添加中文,请查阅第一章内容:《Python+Kivy(App开发)从入门到实践》自学笔记:解决Kivy不能显示中文问题_静候光阴的博客-优快云博客
4.1.3 触发事件
Button按钮主要包括以下两个触发事件:
on_press:按下按钮时触发事件
on_release:按下按钮并释放时,触发该事件
实例:设置Button按钮并触发事件
通过.py文件添加Button按钮,设置触发事件的回调函数,或者通过bind方法重新绑定后,再添加到布局内。由于触发事件传递的参数有2个,所以在回调函数里需要2个参数来匹配,具体代码如下:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class ButtonFloatLayout(FloatLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
from kivy.uix.button import Button
bt = Button(text='Button',on_release=self.release_button)
bt.bind(on_press=self.press_button)
self.add_widget(bt)
def press_button(self,arg):
#按下按钮触发事件的回调函数
print('press_button is running')
def release_button(self,arg):
#按下按钮并释放时触发事件的回调函数
print('release_button is running')
class ButtonApp(App):
def build(self):
return ButtonFloatLayout()
if __name__ == '__main__':
ButtonApp().run()
运行效果如下:
使用.kv文件添加按钮时,将main.py文件中的布局内容删除,内容如下:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class ButtonFloatLayout(FloatLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
def press_button(self,arg):
#按下按钮触发事件的回调函数
print('press_button is running')
def release_button(self,arg):
#按下按钮并释放时触发事件的回调函数
print('release_button is running')
class ButtonApp(App):
def build(self):
return ButtonFloatLayout()
if __name__ == '__main__':
ButtonApp().run()
根据main.py内ButtonApp()类名称,新建button.kv文件,具体内容如下:
<ButtonFloatLayout>:
Button:
text:'Button'
size_hint:.2,.15
pos_hint:{'center_x':.5,'center_y':.5}
background_normal:''
background_color:[.1,.5,.5,1]
on_release:root.release_button(self)
on_press:root.press_button(self)
注:以上代码最后两行,原书内容为:
on_release:root.release_button()
on_press:root.press_button()
运行后报错,提示缺少参数。在调用以上两个方法的时候,传入'self'参数,运行正常,具体如下:
如果想要在一个触发事件内调用多个回调函数,只需要在“:”后换行,并且每行添加对应的回调函数即可,也可以直接使用python语言中的内置方法,具体如下:
<ButtonFloatLayout>:
Button:
text:'Button'
size_hint:.2,.15
pos_hint:{'center_x':.5,'center_y':.5}
background_normal:''
background_color:[.1,.5,.5,1]
on_release:
root.release_button(self)
print('cocpy.com')
on_press:root.press_button(self)
注意:这里要特别注意缩进,在Python语言中,对缩进的要求很严格,且部分编辑器不能直接将<Tab>键替换为4个空格。
运行结果如下:
下一篇:简单UX部件——Label标签