基维:当我改变方向时改变布局

2024-05-13 07:34:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一些东西,当窗口的方向或大小改变时,可以改变它的总体布局。在下面的例子中,我试图用3个按钮来完成这个任务。但它失败了,并抱怨说,当我试图将按钮添加到布局中时,它们已经有了父级。为什么他们已经有父母了?我从来没有把它们添加到AdaptWidget中。。。 更重要的是,我应该如何实现我想实现的目标? 代码如下:

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()

Tags: fromimportselfaddsizebuttonwidgetlayout
2条回答
  1. 编辑:

三天前,我写了这个“答案”,虽然我不能使上述建议起作用。在

但现在有人来了:https://groups.google.com/forum/#!topic/kivy-users/Z5fjt5tNys8 教我怎么做。在

所以解决方案来了:

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(BoxLayout):

    def __init__(self, **kw):
        super(AdaptWidget, self).__init__(**kw)
        # but1 = Button(id='but1', text='button1')
        # but1 = ObjectProperty(None)
        # self.but1 = ObjectProperty(None)
        self.add_widget(Button(id='but1', text='button1'))
        self.add_widget(Button(id='but2', text='button2'))
        self.add_widget(Button(id='but3', text='button3'))

    def on_size(self, *args):
        if self.width > self.height:
            self.orientation = 'horizontal'
            # self.child.but1.size_hint = (0.7, 1)
            # but1.size_hint = (0.7, 1)
            # self.ids.but1.size_hint = (0.7, 1)
            self.children[2].size_hint = (0.7, 1)
            self.children[1].size_hint = (0.5, 1)
            self.children[0].size_hint = (0.5, 1)
        else:
            self.orientation = 'vertical'
            self.children[2].size_hint = (1, 0.7)
            self.children[1].size_hint = (1, 0.5)
            self.children[0].size_hint = (1, 0.5)


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


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

请注意,上面的解决方案比原始代码干净得多。无需移除或清除任何小工具。你只要改变它们的属性。在

  1. 编辑:

部分问题是buildozer.spec'-包含以下内容的文件:

^{pr2}$

而不是这样:

# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all)
orientation = all

每次你的AdaptWidget的大小改变,你的on_size回调都会运行——但是回调不会从它们的父控件中删除任何小部件,因此{}在第二次调用时总是崩溃。您可以始终确保从其父控件中删除小部件:

if widget.parent is not None:
    widget.parent.remove_widget(widget)

相关问题 更多 >