簡體   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