python-3.x之如何在 Kivy 中设置小部件/布局的最小允许宽度/高度

txw1958 阅读:23 2024-09-07 23:24:14 评论:0

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

更新 :
我打错了,size可以是更多 ,但也不少。那应该怎么样?

更新 :
所以这是我的 BoxLayout:

当我展开窗口时,只有侧面部分应该展开:

当我收缩窗口时,侧面部分应该有一些最小尺寸:

所以我认为这是一种固定的最小值。

请您参考如下方法:

Label 的内容大小可通过 texture_size 获得属性,所以你可以设置size_hint为 None 并将大小绑定(bind)到内容大小:

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

您还应该检查 text_size属性(property)。来自 documentation : "默认情况下,标签不受任何边界框的约束。您可以通过此属性设置标签的大小约束。文本将自动流入约束。因此虽然字体大小不会减小,但文本会安排得尽可能地适合盒子,任何仍在盒子外面的文本都被剪掉了”。例如:
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() 

更新
如果您想要更多地控制小部件的缩放方式,您可以创建计算小部件值并将其绑定(bind)到更改大小属性的方法( 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() 


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号