Kivy奇怪的宽度属性后果

时间:2016-04-16 15:27:48

标签: python python-3.x kivy

由于我编写了一个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之类的东西,突然间高度会增加。

1 个答案:

答案 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小部件的大小,它的高度很高。

我不确定你最终想要达到什么目标,但这应该可以解释你得到的结果。