由于我编写了一个Kivy应用程序,我将一个width
属性放入我的自定义窗口小部件定义中进行测试:我的函数应该创建了一个新的宽度,而这个应该不应该在任何地方使用。所以我忘了随着时间推移删除它。但是现在,当我清理代码并试图将其删除时,小部件的height
就崩溃了。高度也是动态的,但据我所知,它与小部件的初始宽度无关,因为高度的创建发生在分配新宽度之后。所以我对导致这种情况的原因感到困惑。注意:我确实使用受保护的属性来计算高度,也许它负责?我把一个快速的脏应用程序放在一起,原谅丑陋,但我试图尽可能地缩短代码。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
global msg_stack
msg_stack = []
Builder.load_string('''
<Custom>:
x: 5
width: 500
BoxLayout:
pos: root.pos
height: self.height
TextInput:
pos: root.pos
size: root.size
id: msg
readonly: True
text: str(msg)
''')
class Custom(Widget):
pass
class TestApp(App):
def build(self):
msg = "A bunch of random words: words, words, words, words, words"
inst = Custom()
inst.ids['msg'].text = msg
inst.width = 500
inst.height = (len(inst.ids['msg']._lines_labels) + 1) * (inst.ids['msg'].line_height + 2)
for i in inst.walk():
i.height = inst.height
i.width = inst.width
bl = BoxLayout(orientation="vertical")
bl.add_widget(inst)
return bl
TestApp().run()
因此,如果此属性设置为500,则高度恰好适合行数(如果向msg
变量添加更多文本,则可以看到)。但是,如果我把它改成50之类的东西,突然间高度会增加。
答案 0 :(得分:0)
以下是解剖的尝试:
您最初将width
Custom
设置为500.在build
中,文本被分配给TextInput
,后者会根据此原始文件计算显示所需的行数大小,因此1行。如果在实例化之前在kv部分中将width
设置为50,那么TextInput
将需要更多行来显示文本,并且由于没有约束height
,它将会是默认值100(您可以在inst.width = ...
中注释掉inst.height = ...
和build
来查看此内容。
现在,如果我们注释掉inst.width = ...
但是留下inst.height = ...
,则会更改高度,因为实际上我们需要大约16行来显示所有文本。在该行之前设置inst.width = 500
将使容器变宽,然后将计算新的高度(仍然基于TextInput
的大小,因为BoxLayout
不会更改它的大小),然后你走过孩子们,并明确地将他们的大小设置为Custom
小部件的大小,它的高度很高。
我不确定你最终想要达到什么目标,但这应该可以解释你得到的结果。