简体   繁体   English

在KIVY上向ActionBar应用添加按钮。 蟒蛇

[英]Add buttons to ActionBar app on KIVY. Python

This a code I copied from the KIVY example directory that comes with the software, I' am trying to modify it, and add other widgets. 这是我从软件随附的KIVY示例目录复制的代码,我正在尝试对其进行修改,并添加其他小部件。

.KV File .KV文件

#:kivy 1.0

<ActionBar>:
    height: '48dp'
    size_hint_y: None
    spacing: '4dp'
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            border: root.border
            pos: self.pos
            size: self.size
            source: self.background_image

<ActionView>:
    orientation: 'horizontal'
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            pos: self.pos
            size: self.size
            source: self.background_image

<ActionSeparator>:
    size_hint_x: None
    minimum_width: '2sp'
    width: self.minimum_width
    canvas:
        Rectangle:
            pos: self.x, self.y + sp(4)
            size: self.width, self.height - sp(8)
            source: self.background_image

<ActionButton,ActionToggleButton>:
    background_normal: 'atlas://data/images/defaulttheme/' + ('action_bar' if self.inside_group else 'action_item')
    background_down: 'atlas://data/images/defaulttheme/action_item_down'
    size_hint_x: None if not root.inside_group else 1
    width: [dp(48) if (root.icon and not root.inside_group) else max(dp(48), (self.texture_size[0] + dp(32))), self.size_hint_x][0]
    color: self.color[:3] + [0 if (root.icon and not root.inside_group) else 1]

    Image:
        opacity: 1 if (root.icon and not root.inside_group) else 0
        source: root.icon
        mipmap: root.mipmap
        pos: root.x + dp(4), root.y + dp(4)
        size: root.width - dp(8), root.height - sp(8)

<ActionGroup>:
    size_hint_x: None
    width: self.texture_size[0] + dp(32)

<ActionCheck>:
    background_normal: 'atlas://data/images/defaulttheme/action_bar' if self.inside_group else 'atlas://data/images/defaulttheme/action_item'

<ActionPrevious>:
    size_hint_x: 1
    minimum_width: '100sp'
    important: True
    BoxLayout:
        orientation: 'horizontal'
        pos: root.pos
        size: root.size
        Image:
            source: root.previous_image
            opacity: 1 if root.with_previous else 0
            allow_stretch: True
            size_hint_x: None
            width: self.texture_size[0] if root.with_previous else dp(8)
            mipmap: root.mipmap
        Image:
            source: root.app_icon
            allow_stretch: True
            size_hint_x: None
            width: min(self.height, self.texture_size[0]) if self.texture else self.height
            mipmap: root.mipmap
        Widget:
            size_hint_x: None
            width: '5sp'
        Label:
            text: root.title
            text_size: self.size
            color: root.color
            shorten: True
            halign: 'left'
            valign: 'middle'

<ActionGroup>:
    background_normal: 'atlas://data/images/defaulttheme/action_group'
    background_down: 'atlas://data/images/defaulttheme/action_group_down'
    background_disabled_normal: 'atlas://data/images/defaulttheme/action_group_disabled'
    border: 30, 30, 3, 3
    ActionSeparator:
        pos: root.pos
        size: root.separator_width, root.height
        opacity: 1 if root.use_separator else 0
        background_image: root.separator_image if root.use_separator else 'action_view'

<ActionOverflow>:
    border: 3, 3, 3, 3
    background_normal: 'atlas://data/images/defaulttheme/action_item'
    background_down: 'atlas://data/images/defaulttheme/action_item_down'
    background_disabled_normal: 'atlas://data/images/defaulttheme/button_disabled'
    size_hint_x: None
    minimum_width: '48sp'
    width: self.texture_size[0] if self.texture else self.minimum_width
    canvas.after:
        Color:
            rgb: 1, 1, 1
        Rectangle:
            pos: root.center_x - sp(16), root.center_y - sp(16)
            size: sp(32), sp(32)
            source: root.overflow_image

<ActionDropDown>:
    auto_width: False

<ContextualActionView>:

.PY File .PY文件

from kivy.base import runTouchApp
from kivy.lang import Builder

runTouchApp(Builder.load_string('''
ActionBar:
    pos_hint: {'top':1}
    ActionView:
        use_separator: True
        ActionPrevious:
            title: 'Action Bar'
            with_previous: False
        ActionOverflow:
        ActionButton:
            text: 'Btn0'
            icon: 'atlas://data/images/defaulttheme/audio-volume-high'
        ActionButton:
            text: 'Btn1'
        ActionButton:
            text: 'Btn2'
        ActionButton:
            text: 'Btn3'
        ActionButton:
            text: 'Btn4'
        ActionGroup:
            text: 'Group1'
            ActionButton:
                text: 'Btn5'
            ActionButton:
                text: 'Btn6'
            ActionButton:
                text: 'Btn7'
'''))

I was trying to add a scroll view feature to this app, but I keep getting error messages. 我试图向该应用程序添加滚动视图功能,但是我一直收到错误消息。 Can someone help me add a button as an example to help me complete this code? 有人可以帮我添加一个按钮作为示例来帮助我完成此代码吗?

Your problem is that you don't understand how it works. 您的问题是您不了解它是如何工作的。

The .kv file is only loaded if you create a subclass of kivy.app.App and let its name end with "App". 仅当您创建kivy.app.App的子类并让其名称以“ App”结尾时,才会加载.kv文件。 Then a .kv file that has the same name without the "App" gets loaded. 然后将加载名称相同但没有“ App”的.kv文件。 You can simply avoid your confusion with moving everything in Builder.load_string to your .kv file and create a subclass of App. 您只需将Builder.load_string中的所有内容移到您的.kv文件并创建App的子类,就可以避免混淆。

Now you can put your ActionBar and your new Button in a horizontal BoxLayout like this: 现在,您可以将ActionBar和新的Button放在水平的BoxLayout中,如下所示:

ActionBarTest.kv: ActionBarTest.kv:

BoxLayout:
    orientation: "horizontal"
    ActionBar: 
        pos_hint: {'top':1} 
        ActionView: 
            use_separator: True 
            ...
    Button:
        #new Button
        text: "Hello World"

main.py main.py

import kivy
from kivy.app import App

class ActionBarTestApp(App):
    def build(self):
        #self.root is already defined, because
        #you set a root object in .kv file
        return self.root

app = ActionBarTestApp()
app.run()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM