本文介绍了如何在Kivy中隐藏ActionButton?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据当前屏幕(使用屏幕管理器)修改ActionButton的可见性.我找不到Visible属性或类似的东西可以简单地切换可见性(对于ActionButton或一般的Widget都没有).

I am trying to modify the visibility of an ActionButton accordingly to the current screen (using Screen Manager). I could not find a Visible property or something like that that can simply toggle visibility (neither for ActionButton nor for Widgets in general) .

2013年的帖子建议更改按钮,但我不想依靠这样的黑客来完成如此简单的任务,此外,我的应用程序的背景是可变的.

A post from 2013 suggests changing the texture of the button, but I don't want to rely on such a hack to accomplish such a simple task, besides, the background of my app will be variable.

另一篇帖子建议删除该小部件并根据需要再次添加.尽管其不必要的复杂性.我修改为在我的情况下可以使用(ActionBar和ActionButton),因此我从ActionView中清除了小部件,然后尝试添加ActionButton.我尝试同时存储一个体弱引用和 self 成员,但同时出现以下错误:

Another post suggest removing the widget and adding it again as needed. Despite its unnecessary complexity. I modified to work in my case (ActionBar and ActionButton), so I clear the widgets from the ActionView and then try to add the ActionButton. I tried storing both a weakref and the self member, with both I got the following error:

WidgetException: Cannot add <kivy.uix.actionbar.ActionButton object at 0x7fcd3fe22ce8>, it already has a parent <kivy.uix.actionbar.ActionView object at 0x7fcd3fe22870>

任何想法将不胜感激.我正在使用开发版本,但在1.8版本中都无法使用.

Any idea would be greatly appreciated. I am working with the dev version, but it neither work with 1.8.

编辑我尝试了以下代码:

EDITI tried the following code:

<AppActionBar>:
    ActionView:
        id: av

        ActionButton:
            id: btn_next
            text: 'Next screen'
            icon: 'data/icons/next_dark.png'
            important: True
            on_release: app.go_next()

此功能在场景加载后运行:

This function is run after the scene is loaded:

def _initialize(self):
  self.next = self.ids.btn_next.__self__ # same result if I don't use .__self__

此代码引发了上面发布的异常:

This code raises the exception posted above:

self.ids.av.clear_widgets()
self.ids.av.add_widget(self.next)

这是完整的异常跟踪:

     self._mainloop()
   File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", line 266, in _mainloop
     EventLoop.idle()
   File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 330, in idle
     Clock.tick_draw()
   File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 429, in tick_draw
     self._process_events_before_frame()
   File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 562, in _process_events_before_frame
     if event.tick(self._last_tick) is False:
   File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 309, in tick
     ret = callback(self._dt)
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/boxlayout.py", line 174, in do_layout
     c.width = w
   File "properties.pyx", line 345, in kivy.properties.Property.__set__ (kivy/properties.c:3589)
   File "properties.pyx", line 377, in kivy.properties.Property.set (kivy/properties.c:4064)
   File "properties.pyx", line 431, in kivy.properties.Property.dispatch (kivy/properties.c:4657)
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/actionbar.py", line 552, in on_width
     self._layout_all()
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/actionbar.py", line 441, in _layout_all
     super_add(child)
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/boxlayout.py", line 212, in add_widget
     return super(BoxLayout, self).add_widget(widget, index)
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/layout.py", line 78, in add_widget
     return super(Layout, self).add_widget(widget, index)
   File "/usr/local/lib/python2.7/dist-packages/kivy/uix/widget.py", line 466, in add_widget
     % (widget, parent))
 WidgetException: Cannot add <kivy.uix.actionbar.ActionButton object at 0x7fecb5d6ed50>, it already has a parent <kivy.uix.actionbar.ActionView object at 0x7fecb5d6e8d8>

推荐答案

隐藏小部件的方法比添加或删除小方法更好.只需将位置设置为包括屏幕外坐标即可:

There's a better way to hide widgets than adding or removing them. Simply set the position to include an offscreen coordinate :

# save the old y-coordinate of MyWidget.pos
root.saved_y = MyWidget.y
# Now move the widget offscreen (recall that pos is just an alias for (x, y))
MyWidget.y = 5000

(我已经测试了此解决方案;它可以工作.)

(I've tested this solution; it works.)

这篇关于如何在Kivy中隐藏ActionButton?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 11:26