【问题标题】:Remove Action Bar Icon Kivy删除操作栏图标 Kivy
【发布时间】:2016-09-24 08:36:56
【问题描述】:

我在 kivy 中的操作栏有上述代码

ActionBar:
		background_color:0,191,255,0.5
		pos_hint: {'top':1}
		
		ActionView:
			ActionPrevious:
				with_previous: False
				text:"    [b]Dhobiwala.com[/b]"
				
				app_icon:""
                ### I make app_icon as a blank string...but it takes default icon...I totally want to remove icon from my action bar

				markup:True
				font_size:"16dp"
				on_release:root.Show_Devlopers_Info()
				

按照上面的代码...我想从状态栏中删除图标...我什至在 Kivy 的文档中都找不到任何东西...有人有什么想法吗?

【问题讨论】:

标签: python android-actionbar kivy


【解决方案1】:

似乎无法禁用图标。
参考:Kivy 来源@github (https://github.com/kivy/kivy/blob/856b305c0c876e53e802f1ac9ae16c21fa91ac1e/kivy/uix/actionbar.py#L214)。
相关部分:

if not self.app_icon:
        self.app_icon = 'data/logo/kivy-icon-32.png'

您可以尝试使用完全透明的小图像作为图标来规避此问题。

另外,您可以尝试将图标的大小减小到 0。查看属性 app_icon_widthapp_icon_heighthttps://kivy.org/docs/api-kivy.uix.actionbar.html#kivy.uix.actionbar.ActionPrevious.app_icon_height

【讨论】:

  • 是的,但我也想删除那个空间......图标不会像 JAVA 制作的 Android 应用程序那样自动调整大小......所以它会带来麻烦......如果有办法删除图标和它所持有的空间......所以它会对我有用......谢谢
  • 如果它重新调整它的大小它也会很棒..因为有时图标重叠其他 ActionBar 小部件...任何解决方案都可以根据不同的分辨率设置它,因为它的 android 应用程序
  • 我编辑了答案以包含有关 app_icon_height / app_icon_width 的信息。我不确定它是否会起作用,但尝试一下也无妨:)
  • 您可以提高我对这个好问题的声誉...谢谢
  • 设置app_icon_width: 1app_icon_height: 1 正在工作。如果将其设置为 0,则它不起作用。
【解决方案2】:

请阅读代码中的 cmets,以便 Frankenstein 了解您隐藏 ActionPrevious 各个方面的首选方法;删除它似乎不是一种选择,当我在 Kivy v1.10.0 上尝试它时,DropDown不高兴,但是可以隐藏部分或整个东西。

#!/usr/bin/env python

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout

## Un-comment if you wish to add to the action view via Python
# from kivy.uix.actionbar import ActionButton, ActionGroup

kv = """
<SomeLayout_GridLayout>:
    cols: 1
    rows: 2
    row_force_default: True
    rows_minimum: {0: ActionBar.height, 1: self.height - ActionBar.height}
    SomeMenu_ActionBar:
        id: ActionBar

<SomeMenu_ActionBar@ActionBar>:
    ActionView:
        id: ActionView
        ## Choose one of the following three pre-coded options
        HiddenIcon_ActionPrevious:
        # HiddenText_ActionPrevious:
        # Hidden_ActionPrevious:

        ## Do the ActionGroup(s) with ActionButton(s) within thing
        ActionGroup:
            id: App_ActionGroup
            mode: 'spinner'
            text: 'App'
            ActionButton:
                text: 'Settings'
                on_press: app.open_settings()
            ActionButton:
                text: 'Quit'
                on_press: app.get_running_app().stop()

        ActionGroup:
            id: File_ActionGroup
            mode: 'spinner'
            text: 'File'
            ActionButton:
                text: 'Open'
            ActionButton:
                text: 'Save'

## Inspired by: https://stackoverflow.com/a/36201399/2632107
##  Hide just the icon, but keep the text, note though
##  that one will lose the 'on_press' and similar methods
<HiddenIcon_ActionPrevious@ActionPrevious>:
    title: app.title if app.title is not None else 'Action Previous'
    with_previous: False
    app_icon: ''
    app_icon_width: 0
    app_icon_height: 0
    ## Comment out the following two lines if you wish to have
    ##  ActionGroup(s) and or ActionButtion(s) pushed to the right
    size_hint_x: None
    width: len(self.title) * 10

## Keep the icon and UI methods but hide the text
<HiddenText_ActionPrevious@ActionPrevious>: #
    with_previous: False
    on_press: print(self)
    title: ''

## Hide everything
<Hidden_ActionPrevious@ActionPrevious>:
    with_previous: False
    on_press: print(self) ## method that will not be called easily
    title: '' ## Try placing text here, only a few pixels should show
    size_hint: None, None
    size: 0, 0
"""


class SomeLayout_GridLayout(GridLayout):
    pass


class SomeApp(App):
    def build(self):
        ## Cannot set this in '__init__' for some reason
        self.title = 'Some Sweet App'

        Builder.load_string(kv)

        some_layout = SomeLayout_GridLayout()
        ## Uncomment next line if ya wish to use 'add_widget'
        ##  method on ActionView and add ActionGroup(s) and/or
        ##  ActionButton(s) via Python
        # some_actionview = some_layout.ids.ActionBar.ids.ActionView
        return some_layout

if __name__ == '__main__':
    SomeApp().run()

【讨论】:

    【解决方案3】:

    这是一个 hack,但由于 kivy.uix.actionbar.ActionPrevious 实际上是 BoxLayout 的子类,因此您实际上可以在创建后使用 remove_widget()clear_widgets() 之类的方法来操作其内容:

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.lang import Builder
    
    kv = """
    <MyWidget>:
        ap: ap
        ActionBar:
            background_color:0,191,255,0.5
            pos_hint: {'top':1}
    
            ActionView:
                ActionPrevious:
                    id: ap
                    with_previous: False
                    text:"    [b]Dhobiwala.com[/b]"
    
                    markup:True
                    font_size:"16dp"
    """
    
    Builder.load_string(kv)
    
    class MyWidget(BoxLayout):
        def __init__(self, *args):
            super(MyWidget, self).__init__(*args)
            self.ap.clear_widgets()
    
    class MyButtonsApp(App):
        def build(self):
            return MyWidget()
    
    if __name__ == '__main__':
        MyButtonsApp().run()
    

    【讨论】:

    • 如果您发现这个问题很有趣,可以增加我的声誉,请点击 +1,因为这个问题可以帮助所有其他人......谢谢
    • ActionPrevious 中没有显示文字,只是空白
    【解决方案4】:

    基维 2.0.0

    要轻松删除ActionBar 中的徽标,只需将ActionPrevious 子级的空字符串设置为。

    ActionPrevious:
        title: 'Title'
        with_previous: False
        app_icon: '' 
    

    以运行此脚本为例

    from kivy.base import runTouchApp
    from kivy.lang import Builder
    
    runTouchApp(Builder.load_string('''
    ActionBar:
        pos_hint: { 'top': 1 }
        background_color: [0, 1, .76, 1]
        background_image: ''
        ActionView:    
            ActionPrevious:
                title: 'Title'
                with_previous: False
                app_icon: ''    # Set the Icon to an empty String           
            ActionOverflow:
            ActionButton:
                text: 'Settings'
                on_press: app.open_settings()
            ActionButton:
                text: 'Quit'
                on_press: app.get_running_app().stop()
    '''))
    

    根据 Kivy 文档,app_icon 只不过是 StringProperty

    【讨论】:

      【解决方案5】:
      ActionPrevious:
         title: 'Recently Available'
         with_previous: False
         app_icon: '' if self.app_icon is not None else "assets/images/P1.png"
      

      【讨论】: