2014-06-08 40 views
1

我的应用程序的第一个屏幕有三个按钮的小菜单(在网格布局中)。两个应该打开弹出窗口。一个用于帮助,另一个用于关于。 第三个更改为另一个屏幕。Kivy Popup或Eventloop的互动?

只有一个弹出窗口工作。第一个调用(在kivy文件中)工作,第二个不打开弹出窗口。如果我在cdd.kv中切换顺序,那么另一个工作。从cdd.kv

摘录:

 CDDMainMenuLayout: 

      HelpButton: 
       size_hint: .5,.5 

      MetadataButton: 
       size_hint: .5,.5 
       on_release: app.root.current = 'metadata' 

      AboutButton: 
       size_hint: .5,.5 

从main.py摘录:

class CDDMainMenuLayout(GridLayout): 
    """ 
    Provides the layout for the three buttons on the home screen. 
    """ 
    def __init__(self, *args, **kwargs): 
     super(CDDMainMenuLayout, self).__init__(*args, **kwargs) 
     self.rows = 1 
     self.cols = 3 
     self.size_hint = (.5,.5) 

...

class CDDButton(Button): 
    def __init__(self, **kwargs): 
     super(CDDButton, self).__init__(**kwargs) 
     self.text = _('Button') 
     self.background_color = colors.grey2 

class AboutButton(CDDButton): 
    def __init__(self, **kwargs): 
     super(AboutButton, self).__init__(**kwargs) 
     self.text = _("About the CDD") 
     self.background_color = colors.red1 
     a = Popup() 
     a.title = _("About Constraint Definition Designer, Version - " + __version__) 
     a.content = RstDocument(source='about.rst') 
     a.size_hint_x = .8 
     a.size_hint_y = .8 
     self.bind(on_release=a.open) 

class HelpButton(CDDButton): 
    def __init__(self, **kwargs): 
     super(HelpButton, self).__init__(**kwargs) 
     self.text = _("Help") 
     self.background_color = colors.green1 
     h = Popup() 
     h.title = _("CDD Help") 
     h.content = RstDocument(source='help.rst') 
     h.size_hint_x = .8 
     h.size_hint_y = .8 
     self.bind(on_release=h.open) 

回答

1

做任何事情的变化,如果你添加额外的行self.popup = hself.popup = a?一种可能性是你的弹出窗口只是被垃圾收集,因为你没有存储任何对它们的引用。我不确定这是否会影响您的特定行为,但值得一试。

+0

嗯,我认为通过将它们添加到kivy语言文件中,然后kivy将对实例的引用放置在对象树中。我错了这是如何工作的? –

+0

是的,将参考添加到按钮中的弹出窗口可以解决问题。现在你指出了这一点,我看到我困惑的地方。谢谢。 –

+0

构件树中的构件互相引用,但弹出式构件是动态构建的,没有引用存储给它们。 – inclement