根据孩子的大小动态调整小部件的大小

时间:2015-09-29 18:34:30

标签: python kivy

我见过this question and answer,这与我想要达到的目标非常接近。

我希望有一个ScrollView显示我的MythTV盒子上即将播放的录音。有一个标题小部件(固定大小)显示日期和一个单独的小部件(BoxLayout)用于记录的详细信息(显示在标签子小部件中)。

我需要根据文本的高度调整BoxLayout的大小。这里的问题是它并不总是具有最多文本的标签,因此最大高度需要考虑所有孩子。

我在我的KV语言文件中有这个:

<MythRecordingHeader>
    text: root.rec_date
    height: 25
    size_hint_y: None
    halign: "left"

<MythRecording>
    orientation: "horizontal"
    #height: 60
    height: max(mrec_desc.texture_size[1], mrec_time.texture_size[1], mrec_title.texture_size[1])
    size_hint_y: None

    BGLabel:
        id: mrec_time
        size_hint: 0.2, None
        text_size: self.width, None
        height: max(self.texture_size[1], mrec_title.texture_size[1], mrec_desc.texture_size[1])
        #size_hint_x: 0.2
        text: root.rec["time"]
        bgcolour: root.bg

    BGLabel:
        id: mrec_title
        size_hint: 0.3, None
        text_size: self.width, None
        height: max(self.texture_size[1], mrec_time.texture_size[1], mrec_desc.texture_size[1])
        #size_hint_x: 0.3
        text: "{}\n{}".format(root.rec["title"], root.rec["subtitle"])
        halign: "left"
        bgcolour: root.bg

    BGLabel:
        id: mrec_desc
        text: root.rec["desc"]
        size_hint: 0.5, None
        text_size: self.width, None
        height: max(self.texture_size[1], mrec_time.texture_size[1], mrec_title.texture_size[1])
        halign: "left"
        bgcolour: root.bg

BGLabel是一个自定义小部件,只需通过bgcolour属性为Label添加纯色背景色。)

并在我的python文件中:

class MythRecording(BoxLayout):
    rec = DictProperty({})
    bg = ListProperty([0.1, 0.15, 0.15, 1])

    def __init__(self, **kwargs):
        super(MythRecording, self).__init__(**kwargs)
        self.rec = kwargs["rec"]

class MythRecordingHeader(BGLabel):
    rec_date = StringProperty("")

    def __init__(self, **kwargs):
        super(MythRecordingHeader, self).__init__(**kwargs)
        self.bgcolour = [0.1, 0.1, 0.4, 1]
        self.rec_date = kwargs["rec_date"]

这几乎和我预期的一样 - BoxLayouts的高度确实有所不同,总的来说,显示所有文字,但有一两次有一些剪辑。我不清楚这是否是由于水平对齐造成的。

我目前正将所有这些孩子放在一个BoxLayout中。

然而,我真正的问题是我需要在ScrollView中获取它(因此我提到的链接)。为了让滚动工作,我想我需要设置BoxLayout的高度,但我真的很难计算出它的高度。

循环查看BoxLayout的子项并查看height属性只显示MythRecordings的高度为0。

有没有办法可以获得所有孩子的总高度并设置BoxLayout的高度,以便我的scrollview能够正常工作?

1 个答案:

答案 0 :(得分:1)

将BoxLayout替换为GridLayout,并设置:

DateTime completeDate = DateTime.Now;

using (SqlConnection connect = new SqlConnection(connectionString))
{
    string updateQueryCompletedDate = @"UPDATE Conversions 
                                        SET CompletedDate = @CompleteDate,
                                        Status = 'Completed'
                                        WHERE ID = @ID"; 

    SqlCommand command1 = new SqlCommand(updateQueryCompletedDate, connect);
    command1.Parameters.AddWithValue("ID", item1.ID);
    command1.Parameters.AddWithValue("CompleteDate",completeDate);

    connect.Open();
    command1.ExecuteNonQuery();
    connect.Close();
}

GridLayout的minimum_size属性会自动跟踪其子级的大小。