2016-12-18 5 views
0

У меня есть следующий Kivy Option PopupKivy Popup динамически изменять высоту

s =''' 
<OptionPopup>: 
    id: optionPopup 
    size_hint : (None,None) 
    width : min(0.95 * self.window.width, dp(500)) 
    title: "Option Title" 
    height: content.height 
    BoxLayout: 
     id: content 
     orientation: 'vertical' 
     spacing: '5dp' 
     height: contentButtons.height + cancelButton.height 
     BoxLayout: 
      id: contentButtons 
      orientation: 'vertical' 
      spacing: '0dp' 
      height : self.minimum_height 

     SettingSpacer: 
     Button: 
      id:cancelButton 
      size_hint_y : None 
      height: '50dp' 
      text: "Back" 
      on_release: optionPopup._dismiss() 


''' 
Builder.load_string(s) 

Это Popup существует только один раз в моем приложении, и я динамически добавлять кнопки в optionPopup.ids["contentButtons"]. Значение изменяется от contentButton. minimum_height изменен. Как я могу правильно настроить размер моих родительских Boxlayouts content и окон PopUp? Вышеуказанные kv варианты, похоже, делают правильную вещь, как привязку optionPopup.height до content.height, но это не сработает?

The popup

ответ

0

Правильные настройки ку-

s =''' 
<OptionPopup>: 
    id: optionPopup 
    size_hint : (None,None) 
    width : min(0.95 * self.window.width, dp(500)) 
    title: "Option Title" 
    height: dp(content.height) + dp(80) 
    BoxLayout: 
     id: content 
     size_hint : (1,None) 
     orientation: 'vertical' 
     spacing: '5dp' 
     height: dp(content.minimum_height) 
     BoxLayout: 
      size_hint : (1,None) 
      id: contentButtons 
      orientation: 'vertical' 
      spacing: '0dp' 
      height : dp(self.minimum_height) 

     SettingSpacer: 
     Button: 
      id:cancelButton 
      size_hint_y : None 
      height: '50dp' 
      text: "Back" 
      on_release: optionPopup._dismiss() 


''' 
Builder.load_string(s) 

class OptionPopup(Popup): 
    def __init__(self,**kwargs): 
     self.window= Window 
     super(OptionPopup,self).__init__(**kwargs) 
     self.content = self.ids["content"] 
     self.contentButtons = self.ids["contentButtons"] 

    def _dismiss(self,*largs): 
     self.dismiss() 

    def open(self): 
     super(OptionPopup,self).open() 

    def _validate(self,instance): 
     if self.optionCallBack is not None: 
      self.optionCallBack(instance.optId) 
     self.dismiss() 

    def setOptions(self,options, callBack): 
     self.optionCallBack = callBack 
     print('OptionPopup::setOptions', options) 
     print('OptionPopup::setOptionCallback: \n option changes go to: ',self.optionCallBack) 
     self.contentButtons.clear_widgets() 
     for optId,name in options.items(): 
      b = Button(text=name, size_hint_y=None, height='50dp') 
      b.optId = optId 
      b.bind(on_release=self._validate) 
      self.contentButtons.add_widget(b) 

    def setTitle(self,text): 
     self.title = text 

Вы можете проверить этот код, добавив его в приложение:

# Test the popup 
o = OptionPopup() 
o.setOptions({'opt1' : 'Options 1','opt2' : 'Options 2', 'opt3' : 'Options 3'}) 
o.open() 
Смежные вопросы