2015-03-28 6 views
0

Я хочу создать что-то, что изменит его общий макет при изменении ориентации или размера окна. В приведенном ниже примере я пытался сделать это с помощью 3 кнопок. Но он терпит неудачу и жалуется, что кнопки уже имеют родителя, когда я пытаюсь добавить их в макет. Почему у них уже есть родитель? Я никогда не добавлял их в AdaptWidget ... Что еще более важно, как должен Я достигаю того, чего хочу достичь? код ниже:Kivy: изменение макета при изменении ориентации

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 

class AdaptWidget(BoxLayoutWrite failed: Broken pipe 
    def __init__(self, **kw): 
     super(AdaptWidget, self).__init__(**kw) 
     self.but1 = Button(text='but1') 
     self.but2 = Button(text='but2') 
     self.but3 = Button(text='but3') 
     self.layout = None 

    def on_size(self, *args): 
     self.clear_widgets() 

     if self.size[0] > self.size[1]: 
      self.layout = BoxLayout(orientation='horizontal') 
      self.but1.size_hint = 0.7, 1 

      self.layout.add_widget(self.but1) 
      vert = BoxLayout(orientation='vertical') 
      self.layout.add_widget(vert) 
      self.but2.size_hint = (1,0.5) 
      self.but3.size_hint = (1,0.5) 
      vert.add_widget(self.but2) 
      vert.add_widget(self.but3) 
     else: 
      self.layout = BoxLayout(orientation='vertical') 
      self.but1.size_hint = 1, 0.7 
      self.layout.add_widget(self.but1) 
      horiz = BoxLayout(oreintation='horizontal') 
      self.layout.add_widget(horiz) 
      self.but2.size_hint = 0.5, 1 
      self.but3.size_hint = 0.5, 1 
      horiz.add_widget(self.but2) 
      horiz.add_widget(self.but3) 

     self.add_widget(self.layout) 

class TestLayoutApp(App): 
    def build(self): 
     return AdaptWidget() 

if __name__ == '__main__': 
    TestLayoutApp().run() 
+0

Вы не можете использовать ** ScreenManager ** и просто ** switch_to ** еще один макет, когда ** on_size() **? – Anzel

ответ

1

Каждый раз, когда размер ваших AdaptWidget изменений, ваши on_size прогонов обратного вызова - но обратный вызов не удаляют виджеты от своих родителей, так on_size всегда врезаться во второй раз она называется. Вы всегда можете убедиться, что виджет удален из его родителя:

if widget.parent is not None: 
    widget.parent.remove_widget(widget) 
Смежные вопросы