繁体   English   中英

如何在 Kivy 中动态更改 size_hint

[英]How to change size_hint dynamically in Kivy

我正在使用 Python 中的 Kivy 制作 GUI。

我使用下面的代码动态添加了一个按钮。

recycleViewTest1.py

#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button

Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')  # eliminate annoying circle drawing on right click

from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                id: box
                size_hint_y: 1.0
                orientation: 'vertical'

                Button:
                    size_hint_y: 1.0
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()
""")

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

from kivy.properties import StringProperty


class AddItemWidget(Widget):
    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)
        self.count = 0

    def buttonClicked(self):
        self.count += 1
        newButt = Button(text='Button'+ str(self.count),size_hint_y=1.0)
        self.ids.box.add_widget(newButt, index=1)
        self.ids.box.size_hint_y = 1.0 + 1.0 * self.count


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

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

当实际执行 recycleViewTest1.py 时,它的行为如下图所示。

在此处输入图像描述

当我按下“添加项目”按钮时,按钮被动态添加,size_hint_y被分割。

但我不想拆分 size_hint_y。

添加按钮后,我想使用 RecycleView 使其可滚动,如下图所示。我想保持按钮大小不变。

在此处输入图像描述

我使用 recycleViewTest2.py 创建了上面的图像。

recycleViewTest2.py

#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button

Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')  # eliminate annoying circle drawing on right click

from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                id: box
                size_hint_y: 2.0
                orientation: 'vertical'

                Button:
                    size_hint_y: 1.0
                    text: "Button1"

                Button:
                    size_hint_y: 1.0
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()
""")

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

from kivy.properties import StringProperty


class AddItemWidget(Widget):
    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)
        self.count = 0

    def buttonClicked(self):
        self.count += 1
        newButt = Button(text='Button'+ str(self.count),size_hint_y=1.0)
        self.ids.box.add_widget(newButt, index=1)


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

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

recycleViewTest2.py 接近理想状态,但我想添加一个元素,在按下“添加项目”按钮时保持按钮大小不变。

当我按下 recycleViewTest2.py 中的 Add Item 按钮时,按钮大小会减小。

如何在使 recycleViewTest1.py 像 recycleViewTest2.py 一样工作时修复按钮大小?

我写了recycleViewTest3.py。

recycleViewTest3.py

#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button

Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')  # eliminate annoying circle drawing on right click

from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                id: box
                size_hint_y: 1.01
                orientation: 'vertical'

                Button:
                    size_hint_y: 0.5
                    text: "Button1"

                Button:
                    size_hint_y: 0.5
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()

                Label:
                    size_hint_y: 0.01
                    text: ""
""")

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

from kivy.properties import StringProperty


class AddItemWidget(Widget):
    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)
        self.count = 0

    def buttonClicked(self):
        self.count += 1
        self.ids.box.size_hint_y = self.ids.box.size_hint_y + 0.5
        newButt = Button(text='Button'+ str(self.count),size_hint_y=0.5)
        self.ids.box.add_widget(newButt, index=1)


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

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

recycleViewTest3.py 将 boxLayout 的 size_hint_y 增加按钮的数量,这应该是它的样子。

但是,在按下“添加项目”按钮后,按钮的大小立即变得不正常。 滚动鼠标将固定按钮大小。

在此处输入图像描述

我想知道是否有办法添加这样的按钮并立即更新 size_hint_y。

为了防止按钮自动改变大小,您必须手动为它们提供一个。

Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                id: box
                size_hint_y: None
                height: self.minimum_height  # use this to keep its size relative to its children
                orientation: 'vertical'

                Widget:  # bonus: use this to keep the buttons to the bottom
                    size_hint_y: None
                    height: root.height - ((len(box.children) - 1) * dp(60))

                Button:
                    text: "Button0"
                    size_hint_y: None
                    height: dp(60)

                Button:
                    size_hint_y: None
                    height: dp(60)
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()
""")


class AddItemWidget(Widget):
    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)
        self.count = 0

    def buttonClicked(self):
        self.count += 1
        newButt = Button(text='Button'+ str(self.count),size_hint_y=None, height=dp(60))
        self.ids.box.add_widget(newButt, index=1)


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM