将按钮的背景更改为不同的形状和样式,如kivy python中的阴影效果等

将按钮的背景更改为不同的形状和样式,如kivy python中的阴影效果等,python,button,user-interface,kivy,Python,Button,User Interface,Kivy,我了解到,在Qt中,我们确实有一些方法可以通过以下方式制作QpushButton: 阴影效应 通过将setFlat属性设置为True使其平坦 如果有人像按钮_18.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))一样在光标上悬停,则更改不同类型的光标 我希望使纽扣的行为类似于基维以及。可能吗? 我了解到,我们可以将背景图像更改为圆形图像 但这并不令人满意,因为按钮看起来仍然很正常。没有阴影的影响。即使当我们点击按钮外的角落时,如果点击

我了解到,在Qt中,我们确实有一些方法可以通过以下方式制作QpushButton:

  • 阴影效应
  • 通过将setFlat属性设置为True使其平坦
  • 如果有人像按钮_18.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))一样在光标上悬停,则更改不同类型的光标
  • 我希望使纽扣的行为类似于基维以及。可能吗? 我了解到,我们可以将背景图像更改为圆形图像

    但这并不令人满意,因为按钮看起来仍然很正常。没有阴影的影响。即使当我们点击按钮外的角落时,如果点击按钮,它也会被视为s

    我已经阅读了Kivy按钮和标签的文档,并试图改变按钮的行为和外观。是否有人能就如何使按钮看起来更好提供建议我们可以尝试:

  • 阴影效应
  • 背景中的动画效果
  • 圆边等
  • 我们可以把动画gif图像作为动画的背景吗(我试过了,但它不再是动画了)
  • 下面是我刚刚创建的代码,用于探索Kivy中的按钮:

    __author__ = 'pbatra'
    #Good info about background
    #https://stackoverflow.com/questions/20181250/changing-the-background-color-of-a-button-    in-kivy/20181407#20181407
    
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.properties import ObjectProperty
    from kivy.uix.image import Image
    from kivy.graphics import Color
    
    
    gui = '''
    <MenuScreen>:
        canvas.before:
            BorderImage:
                # BorderImage behaves like the CSS BorderImage
                border: 10, 10, 10, 10
                texture: self.background_image.texture
                pos: self.pos
                size: self.size
        GridLayout:
            size_hint: .1, .1
            pos_hint: {'center_x': .5, 'center_y': .5}
            rows: 1
            Button:
                text: 'Play'
                font_size: 20
                font_name: 'DroidSans'
                bold: True
                italic: True
                height: 10
                background_color: (0.5, 0.7, 0.5, 0.9)
                #Read more about them from documentation
                background_normal: './images/orange.png'
                background_down: './images/green.png'
                border: 30,30,30,30
                color: (1, .3, .8, .5)
    
            on_press: self.text = 'Oh yeah'
    
    '''
    
    
    class MenuScreen(Screen):
        background_image = ObjectProperty(
                                    Image(
                                        source='../Examples/examples/widgets/sequenced_images/data/images/button_white_animated.zip',
                                        anim_delay=.5))
        Builder.load_string(gui)
        pass
    
    # Create the screen manager
    sm = ScreenManager()
    sm.add_widget(MenuScreen(name='menu'))
    
    
    class MyJB(App):
        def build(self):
            return sm
    
    if __name__ == '__main__':
        MyJB().run() 
    
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    #关于背景的好信息
    #https://stackoverflow.com/questions/20181250/changing-the-background-color-of-a-button-    在kivy/20181407#20181407中
    从kivy.app导入应用程序
    从kivy.lang导入生成器
    从kivy.uix.screenmanager导入screenmanager,屏幕
    从kivy.properties导入ObjectProperty
    从kivy.uix.image导入图像
    从kivy.graphics导入颜色
    gui=“”
    :
    在以下情况之前:
    边框图像:
    #BorderImage的行为类似于CSS BorderImage
    边界:10,10,10,10
    纹理:self.background\u image.texture
    pos:self.pos
    大小:self.size
    网格布局:
    大小提示:.1,.1
    位置提示:{'center_x':.5'center_y':.5}
    行数:1
    按钮:
    文字:“播放”
    字体大小:20
    字体名称:“机器人”
    黑体字:对
    斜体:对
    身高:10
    背景颜色:(0.5,0.7,0.5,0.9)
    #从文档中了解更多关于它们的信息
    背景_正常:'./images/orange.png'
    背景向下:'./images/green.png'
    边界:30,30,30,30
    颜色:(1.3.8.5)
    按:self.text='哦,是的'
    '''
    类菜单屏幕(屏幕):
    背景\图像=对象属性(
    形象(
    source='../Examples/Examples/widgets/sequenced_images/data/images/button_white_animated.zip',
    动画(延迟=0.5))
    Builder.load_字符串(gui)
    通过
    #创建屏幕管理器
    sm=屏幕管理器()
    sm.add_小部件(菜单浏览(name='menu'))
    类别MyJB(应用程序):
    def生成(自):
    返回sm
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    MyJB().run()
    
    kivy中的按钮以a开头,该按钮与添加属性(如background_normal/down)相结合,用于处理画布上的纹理

    知道了这一点,您可以简单地将ButtonBevior与您选择的任何其他小部件组合。例如

    from kivy.base import runTouchApp
    from kivy.lang import Builder
    
    kv = '''
    <ButImage@ButtonBehavior+AsyncImage>
    
    FloatLayout:
        # we don't specify anything here so float layout takes the entire size of the window.
        ButImage:
            id: but
            # take 50% size of the FloatLayout
            size_hint: .5, .5
            # Make Button change it's opacity when pressed for visual indication
            opacity: 1 if self.state == 'normal' else .5
            source: 'http://www.victoriamorrow.com/sitebuildercontent/sitebuilderpictures/enter_button.gif'
            # Introduce Label incase you want text on top of the image
            Label:
                center: but.center
                # change text acc to but state
                text: "Normal" if but.state == 'normal' else 'down'
    '''
    
    if __name__ == '__main__':
        runTouchApp(Builder.load_string(kv))
    
    从kivy.base导入runTouchApp
    从kivy.lang导入生成器
    kv='''
    浮动布局:
    #我们在这里没有指定任何内容,所以float布局占用窗口的整个大小。
    但是图像:
    id:但是
    #采用浮动布局的50%大小
    大小提示:.5,.5
    #使按钮改变其不透明度时,按下视觉指示
    不透明度:如果self.state=='normal'else,则为1。5
    资料来源:'http://www.victoriamorrow.com/sitebuildercontent/sitebuilderpictures/enter_button.gif'
    #引入标签,以防需要在图像顶部添加文本
    标签:
    中锋:但是,中锋
    #根据但状态更改文本
    文本:“正常”如果but.state=='Normal'else'down'
    '''
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    runTouchApp(建筑商负载线(kv))
    
    在这里,我们只需将ButtonBevior设置为与从web下载图像作为背景的应用程序相结合

    你应该看到这样的东西

    背景中的动画效果

    这就像将源文件更改为动画gif或.zip中的图像列表一样简单

    from kivy.base import runTouchApp
    from kivy.lang import Builder
    
    
    kv = '''
    <ButImage@ButtonBehavior+AsyncImage>
    
    FloatLayout:
        ButImage:
            id: but
            size_hint: .5, .5
            opacity: 1 if self.state == 'normal' else .5
            allow_stretch: True
            keep_ratio: False
            source: 'http://media1.policymic.com/site/article-items/2095/1_gif.gif'
            Label:
                center: but.center
                text: "Normal" if but.state == 'normal' else 'down'
    
    
    '''
    
    if __name__ == '__main__':
        runTouchApp(Builder.load_string(kv))
    
    从kivy.base导入runTouchApp
    从kivy.lang导入生成器
    kv='''
    浮动布局:
    但是图像:
    id:但是
    大小提示:.5,.5
    不透明度:如果self.state=='normal'else,则为1。5
    允许拉伸:真
    保留比率:False
    资料来源:'http://media1.policymic.com/site/article-items/2095/1_gif.gif'
    标签:
    中锋:但是,中锋
    文本:“正常”如果but.state=='Normal'else'down'
    '''
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    runTouchApp(建筑商负载线(kv))
    
    看看这个例子,它是在ButtonBehavior被引入之前完成的,所以它甚至有一个使用旧方法的类的例子,这个方法基本上不再需要了

    阴影效果:

    有很多方法可以做到这一点

    您可以将阴影添加到小部件/布局中,并使此小部件/布局顶部的按钮比阴影占用更少的空间,以便考虑阴影上的触摸

    或者创建您自己的CustomButtonBehavior类,该类派生自ButtonBehavior,该类重写
    collidepoint
    方法,仅为自定义冲突返回True。这里有一个使用for小部件的示例。您甚至可以将图像的
    keep_data
    属性设置为True,然后检查alpha数据以确定是否要为碰撞返回True

    圆边等

    只需使用圆角图像kivy支持使用BorderImage指令,这在功能上与css BorderImage相当。Kivy自己的按钮默认使用此选项。 尝试使用边界属性
    from kivy.app import App from  
    kivy.uix.floatlayout import FloatLayout
    from kivy.uix.button import Button
    
    
    class lay(FloatLayout):
        def __init__(self, **kwargs):
           super(lay,self).__init__(**kwargs)
           self.btn = Button(background_normal='image_state_on.png',
           background_down='image_state_off', size_hint_x = .50, size_hint_y = .50)
           self.add_widget(self.btn)
    
    class ImageButton_APP(App):
        def build(self):
               return lay()
    
    
    ImageButton_APP().run()