Kivy控件的hover事件实现

   日期:2024-01-17     浏览:42    评论:0    

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. 总结

  1. hover功能需要用到Clock类的schedule_once(func, second)方法

  2. 不同的控件背景颜色的设置有所不同,不外乎这几个属性:background_color, background_normal, background_down, background_image。有时候还可以使用canvas.before来设置背景色

  3. 鼠标的样式在同一种类的控件中,只有最后一个控件起作用,本人暂时不知道什么原因。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服