如何在Kivy中设置小部件/布局的最小允许宽度/高度?

Nec*_*ron 3 size python-3.x kivy python-3.4

我有3个元素的BoxLayout,我需要第一个和最后一个元素占用最小的可用空间。中间元素的比例是固定的(1:1),因此当我调整窗口大小时,侧面元素会变得太小,内容会从窗口中消失。我需要标签(或按钮,甚至不同元素的集合)的文本始终位于标签内。此大小不应更大,因此我可以说它应该是固定大小,具体取决于其内容。

更新:我犯了一个错误,大小可以更多,但不能更少。那应该如何?

更新:所以这是我的BoxLayout: 在此处输入图片说明 当我扩展窗口时,只有侧面部分应该扩展: 在此处输入图片说明 当我收缩窗户时,侧面部件应具有一些最小尺寸: 在此处输入图片说明 因此,我认为这是固定的下限。

Nyk*_*kin 6

的内容大小Label可通过texture_size属性获得,因此您可以设置size_hint为无并将大小绑定到内容大小:

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

from kivy.lang import Builder

kv = '''
<MyButton>:
    size_hint: None, 1
    size: self.texture_size
'''
Builder.load_string(kv)

class MyButton(Button):
    pass

class MyWidget(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_widget(MyButton(text="Fixed size button"))
        self.add_widget(Button(text="Normal button"))
        self.add_widget(MyButton(text="Fixed size button"))         

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()
Run Code Online (Sandbox Code Playgroud)

您还应该检查text_size属性。来自文档:“默认情况下,标签不限于任何边界框。您可以使用此属性设置标签的大小约束。文本将自动流入约束中。因此,尽管不会减小字体大小,但文本将被安排为尽可能地适合该框,但仍将框外的所有文本剪掉。” 例如:

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

from kivy.lang import Builder

kv = '''
<MyButton>:
    text_size: self.size
    valign: "middle"
    halign: "center"
'''
Builder.load_string(kv)

class MyButton(Button):
    pass

class MyWidget(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_widget(MyButton(text="Example text which is too long to fit in one line"))
        self.add_widget(Button(text="Normal button"))
        self.add_widget(MyButton(text="Example text which is too long to fit in one line"))

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()
Run Code Online (Sandbox Code Playgroud)

UPDATE 如果您想进一步控制小部件的缩放方式,则可以创建一种方法,该方法可以计算小部件的值并将其绑定到更改size属性(bind或者实现on_size())。例如:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.label import Label

from kivy.lang import Builder

from functools import partial

kv = '''
<CentralWidget>:
    pos_hint: {'center_y': .5} 
    size_hint: None, None
    canvas:
        Color:
            rgb: 1, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size

<SideWidget>:
    pos_hint: {'center_y': .5} 
    size_hint: None, 1
    canvas.before:
        Color:
            rgb: 0, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size
'''

Builder.load_string(kv)

class CentralWidget(Widget):
    pass

class SideWidget(Label):
    pass

class MyWidget(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        w1 = SideWidget(text="............................")
        w2 = CentralWidget()
        w3 = SideWidget(text="............................")

        self.add_widget(w1)
        self.add_widget(w2)
        self.add_widget(w3)

    def on_size(self, *args):
        # self.size - size of parent widget
        # self.children - children of widget
        # self.children[0].texture_size - sife of content of selectend children widget
        # self.children[0].size - size of selected children widget to set
        if((self.size[0]-500)/2 > self.children[0].texture_size[0]):
            self.children[0].size = ((self.size[0]-500)/2, 0)     
            self.children[1].size = (500, 500)   
            self.children[2].size = ((self.size[0]-500)/2, 0)   
        else:
            self.children[1].size = (self.size[0]-2*self.children[0].texture_size[0], self.size[0]-2*self.children[0].texture_size[0])  

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()
Run Code Online (Sandbox Code Playgroud)