在编写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,高度会突然增加
下面是解剖的尝试:
您最初将
Custom
的width
设置为500。在build
中,文本被分配给TextInput
,它从原始大小计算它需要显示的行,因此是1行。如果在实例化之前,将kv部分中的width
设置为50,那么TextInput
将需要更多的行来显示文本,并且由于height
上没有设置任何约束,因此它将是默认的100(您可以通过注释inst.width = ...
和inst.height = ...
来看到这一点)。 现在,如果我们注释掉inst.width = ...
,而不注释inst.height = ...
,那么高度将会改变,因为我们确实需要16行来显示所有文本。在该行之前设置inst.width = 500
将使容器变宽,然后将计算新的高度(仍然基于TextInput
的大小,因为BoxLayout
不会更改其大小),然后遍历子对象并将它们的大小显式设置为Custom
小部件的大小,该小部件具有较高的高度我不确定你最终想要达到什么,但这应该可以解释你得到的结果
相关问题 更多 >
编程相关推荐