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