【发布时间】:2014-06-06 07:53:52
【问题描述】:
我正在尝试根据当前屏幕修改 ActionButton 的可见性(使用屏幕管理器)。我找不到 Visible 属性或类似的东西可以简单地切换可见性(对于 ActionButton 和一般的小部件都不是)。
A post from 2013 建议更改按钮的纹理,但我不想依靠这样的 hack 来完成这样一个简单的任务,而且我的应用程序的背景会发生变化。
Another post 建议删除小部件并根据需要再次添加。尽管它不必要的复杂性。我修改为在我的情况下工作(ActionBar 和 ActionButton),所以我从 ActionView 中清除了小部件,然后尝试添加 ActionButton。我尝试同时存储 weakref 和 self 成员,但都出现以下错误:
WidgetException: Cannot add <kivy.uix.actionbar.ActionButton object at 0x7fcd3fe22ce8>, it already has a parent <kivy.uix.actionbar.ActionView object at 0x7fcd3fe22870>
任何想法将不胜感激。我正在使用开发版本,但它不适用于 1.8。
编辑 我尝试了以下代码:
<AppActionBar>:
ActionView:
id: av
ActionButton:
id: btn_next
text: 'Next screen'
icon: 'data/icons/next_dark.png'
important: True
on_release: app.go_next()
该函数在场景加载后运行:
def _initialize(self):
self.next = self.ids.btn_next.__self__ # same result if I don't use .__self__
此代码引发了上面发布的异常:
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>
【问题讨论】:
-
你能发一些你试过的代码吗?
-
当然,我添加了一个简短的示例。
-
@papirin - 如果您可以发布完整示例,我可能会为您提供帮助。一个正在运行的代码......我也遇到了一些按钮的此类问题,我修复了它。可能我们需要通过使用 try catch 或其他东西来进行调整(其他东西会比 try catch 更整洁):)
-
@paarthbatra 非常感谢您查看此内容。我终于发现问题确实是 ActionView 处理其子项的方式中的一个错误,但此功能仍在开发中。等ActionBar稳定下来再看。
-
你也可以设置不透明度
self.next.opacity = 0来隐藏按钮,设置self.next.opacity = 1来显示它虽然它可能不是你想要的,因为它只是让它透明。