Kivy控件的hover事件实现
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
class MyLayout(BoxLayout): pass
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')
<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'
class MainApp(App): def build(self): # 窗体不全屏显示 Window.fullscreen = False # 加载kv文件布局数据 Builder.load_file('./kvs/test.kv') # 返回root根控件 return MyLayout()
if __name__ == '__main__': MainApp().run()
运行之后,效果还是可以的,鼠标移入任何按钮中都能产生背景图片的变更:
-
-
不同的控件背景颜色的设置有所不同,不外乎这几个属性:
background_color
,background_normal
,background_down
,background_image
。有时候还可以使用canvas.before
来设置背景色 -
posted on 2020-05-27 12:03 yellowstronger 阅读(747) 评论(1) 编辑 收藏 举报