奇异宽度属性的后果

2024-09-14 22:59:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在编写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,高度会突然增加


Tags: fromposimport宽度高度属性部件msg
1条回答
网友
1楼 · 发布于 2024-09-14 22:59:04

下面是解剖的尝试:

您最初将Customwidth设置为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小部件的大小,该小部件具有较高的高度

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

相关问题 更多 >