【问题标题】:On Hover for Kivy ActionBar ActionButton悬停在 Kivy ActionBar ActionButton 上
【发布时间】:2020-04-02 06:24:26
【问题描述】:

根据This Github File,我试图在 python 3.7.5 windows 10 平台中为操作按钮创建悬停。这是我尝试过的:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.actionbar import *
from kivy.properties import ObjectProperty
from kivy.properties import BooleanProperty
class HoverBehavior(object):

    hovered = BooleanProperty(False)
    border_point= ObjectProperty(None)
    def __init__(self, **kwargs):
        self.register_event_type('on_enter')
        self.register_event_type('on_leave')
        Window.bind(mouse_pos=self.on_mouse_pos)
        super(HoverBehavior, self).__init__(**kwargs)

    def on_mouse_pos(self, *args):
        if not self.get_root_window():
            return # do proceed if I'm not displayed <=> If have no parent
        pos = args[1]
        #Next line to_widget allow to compensate for relative layout
        inside = self.collide_point(*self.to_widget(*pos))
        if self.hovered == inside:
            #We have already done what was needed
            return
        self.border_point = pos
        self.hovered = inside
        if inside:
            self.dispatch('on_enter')
        else:
            self.dispatch('on_leave')

    def on_enter(self):
        pass

    def on_leave(self):
        pass
from kivy.factory import Factory
Factory.register('HoverBehavior', HoverBehavior)
Builder.load_string("""
<TitleBar>:
    ActionBar:
        pos_hint: {'top':1}
        width: 50
        color: [ 1, 1, 1, 1]
        ActionView:
            use_separator: True
            ActionPrevious:
                title: 'Hello'
                with_previous: False
                color: [ 0, 0, 0, 1]
            ActionOverflow:
            ActionButton:
                icon: 'icons/app_close_init.png' if self.hovered else "icons/app_close_hover.png"
                on_press: app.closing()
            ActionButton:
                important: True
                text: 'Important'
                color: [ 0, 0, 0, 1]
            ActionButton:
                text: 'Btn2'
            ActionButton:
                text: 'Btn3'
            ActionButton:
                text: 'Btn4'
""")
class TitleBar(FloatLayout):
    pass

class TetraApp(App):

    def build(self):
        Window.size=(875,575)
        Window.clearcolor = (1, 1, 1, 1)
        Window.borderless=True
        return TitleBar()
    def on_press_button(self):
        return self.root.add_widget(Label(text='Hello'))
    def closing(self):
        app.stop()
if __name__=='__main__':
    app=TetraApp()
    app.run()

错误说操作按钮没有属性hovered,但我已经定义了HoverBehaviour 类。我做错了什么?操作按钮用于在鼠标悬停在其上时将图标图像从一个更改为另一个。
已编辑
也试过了:

class HoverBehavior(object):
    def __init__(self, **kwargs):
        self.hovered = BooleanProperty(False)
        self.border_point= ObjectProperty(None)
        self.register_event_type('on_enter')
        self.register_event_type('on_leave')
        Window.bind(mouse_pos=self.on_mouse_pos)
        super(HoverBehavior, self).__init__(**kwargs)

    def on_mouse_pos(self, *args):
        if not self.get_root_window():

但这也显示了Attribute Error。

【问题讨论】:

  • 你没有定义on_hover方法吧?也许添加def on_hover(self): pass 会使其工作。
  • @SwastikUdupa 它说AttributeError: 'ActionButton' object has no attribute 'hovered'
  • 我尝试在 TetraApp 类中定义 hovered 并没有!
  • 在实例化悬停时尝试在类中使用self.hovered = BooleanProperty(False)。
  • @SwastikUdupa 在哪个班级?你能说出台词吗?

标签: python python-3.x error-handling kivy


【解决方案1】:

你已经定义了你的HoverBehavior,但你并没有真正使用它,所以ActionButton 对HoverBehavior 一无所知。要使用它,请定义您自己的自定义 ActionButton,例如:

class MyActionButton(HoverBehavior, ActionButton):
    pass

然后,在您的 kv 文件中,将 ActionButton 替换为 MyActionButton:

        MyActionButton:
            icon: 'icons/app_close_init.png' if self.hovered else "icons/app_close_hover.png"
            on_press: app.closing()

【讨论】:

  • 完美!。但是为什么操作栏中的width:50 和color: [1,1,1,1] 不起作用?它不适合我。我正在尝试让操作栏变白并更改其大小
  • 要改变它的宽度,你必须先关闭size_hint的宽度,使用size_hint_x: None。 ActionBar 的背景颜色实际上是一个图像。要消除图像并获得白色背景,请使用background_image: ''。
  • 谢谢!你很聪明,但背景仍然是黑色的
  • 我不得不将颜色更改为背景颜色。谢谢
  • Python Tutorial 很好,但我只是通过 Python 编程来学习的,并且花了很多时间阅读documentation 以了解如何使用 Python 的特定部分。
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多