2014-06-08 4 views
1

На первом экране моего приложения есть небольшое меню (в gridlayout) из трех кнопок. Два должны открывать всплывающие окна. Один для справки и один для About. Третий вариант меняется на другой экран.Kivy Popup или Eventloop Interaction?

Только одно всплывающее окно работает. Первый, который называется (в файле 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 = h и self.popup = a? Одна из возможностей заключается в том, что ваши всплывающие окна просто собирают мусор, так как вы не храните никаких ссылок на них. Я не уверен, если/как это даст ваше конкретное поведение, но стоит попробовать.

+0

Хммм, я думал, что, добавив их в файл языка киви, тогда киви помещал ссылку на экземпляр в дереве объектов. Я не прав, как это работает? –

+0

Да, добавление ссылки на всплывающее окно кнопки устраняет проблему. Теперь, когда вы указали это, я вижу, где я был в замешательстве. Благодарю. –

+0

Виджеты в дереве виджетов ссылаются друг на друга, но ваши всплывающие окна динамически построены без ссылки, хранящейся в них. – inclement

Смежные вопросы