1. 导入依赖模块
from kivy.app import App from kivy.core.window import Window from kivy.clock import Clock from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder from kivy.uix.button import Button
2. 自定义布局控件和按钮
我们需要自定义程序的整体布局类MyLayout,这个类就是整个应用的布局。
class MyLayout(BoxLayout): pass
自定义的HoverButton按钮可以实现鼠标移入移出的效果。在这个类里,在初始化的时候就要绑定鼠标坐标的位置相应处理方法,实时地检测鼠标的位置是否进入到了按钮内部,如果进入了则更改相应的属性,鼠标移除了则恢复到原来的样式。
1 class HoverButton(Button): 2 def __init__(self, **kwargs): 3 # 调用父类的初始化函数 4 super(HoverButton, self).__init__(**kwargs) 5 # 设置控件水平充满,垂直自定高度 6 self.size_hint = (1, None) 7 self.height = 50 8 # 绑定[订阅]鼠标位置变化事件处理方法 9 Window.bind(mouse_pos=self.on_mouse_pos) 10 11 # 鼠标位置处理方法 12 def on_mouse_pos(self, *args): 13 # 判断控件是否在root根控件中 14 if not self.get_root_window(): 15 return 16 # 获取鼠标位置数据 17 pos = args[1] 18 # 检查鼠标位置是否在控件内 19 if self.collide_point(*pos): 20 # 如果在控件上,则调用鼠标进入的样式方法 21 Clock.schedule_once(self.mouse_enter_css, 0) 22 else: 23 # 如果在控件上,则调用鼠标移出的样式方法 24 Clock.schedule_once(self.mouse_leave_css, 0) 25 26 def mouse_leave_css(self, *args): 27 # 重设背景和鼠标样式 28 self.background_normal = './imgs/button_normal.png' 29 Window.set_system_cursor('arrow') 30 31 def mouse_enter_css(self, *args): 32 self.background_normal = './imgs/button_down.png' 33 Window.set_system_cursor('hand')
3. kv中的布局
一般定义好布局类后,我们会在kv中配置布局细节
<MyLayout>: orientation: 'horizontal' padding: 2 spacing: 2 canvas.before: Color: rgba: 1, 1, 1, 1 Rectangle: size: self.size pos: self.pos HoverButton: text: 'btn1' HoverButton: text: 'btn2' HoverButton: text: 'btn3' HoverButton: text: 'btn4'
4. 定义App类
class MainApp(App): def build(self): # 窗体不全屏显示 Window.fullscreen = False # 加载kv文件布局数据 Builder.load_file('./kvs/test.kv') # 返回root根控件 return MyLayout()
5. 测试结果
if __name__ == '__main__': MainApp().run()
运行之后,效果还是可以的,鼠标移入任何按钮中都能产生背景图片的变更:
但是有一个问题,所有的按钮只有最后一个按钮,当鼠标移入时鼠标样式变成了小手,前面的按钮好像没有起作用,但是背景图片样式都能起作用。看来对kivy的知识还需要慢慢积累。
6. 总结
-
hover功能需要用到Clock类的schedule_once(func, second)方法 -
不同的控件背景颜色的设置有所不同,不外乎这几个属性:
background_color,background_normal,background_down,background_image。有时候还可以使用canvas.before来设置背景色 -
鼠标的样式在同一种类的控件中,只有最后一个控件起作用,本人暂时不知道什么原因。




