如何在GridLayout中添加新的小部件而不调整旧的小部件的大小?

时间:2019-05-29 22:16:30

标签: python python-3.x kivy

我已经将GridLayout添加到ScrollView中,并且正在从python程序动态添加到GridLayout中的小部件。与其使用更多的窗口空间,不如调整旧小部件的高度。

我尝试将BoxLayout放入GridLayout中,但是它不起作用。 我还尝试将小部件直接添加到ScrollView,但是我发现ScrollView仅支持一个小部件。

我的kv代码:

<Downloading>:
    my_grid: mygrid
    GridLayout:
        cols: 1
        size_hint_y : None
        hight: self.minimum_height
        id: mygrid

我的python代码:

class Downloading(ScrollView):
    set_text = ObjectProperty()
    my_grid = ObjectProperty()

    def __init__(self, select, link, path, username, password):

        self.select = select
        self.link = link
        self.path = path
        self.username = username
        self.password = password
        self.p_bar = []
        self.stat = []

        self.parent_conn, self.child_conn = Pipe()

        p = Process(target=main, args=(self.child_conn, self.select,
                                       self.link, self.path,
                                       self.username, self.password))
        p.start()

        super().__init__()

        self.event = Clock.schedule_interval(self.download_GUI, 0.1)

    def newFile(self, title):
        # self.newId = "stat" + str(len(self.p_bar) + 1)
        self.stat.append(Label(text=''))
        self.p_bar.append(ProgressBar())
        self.my_grid.add_widget(Label(text=title))
        self.my_grid.add_widget(self.stat[-1])
        self.my_grid.add_widget(self.p_bar[-1])

    def download_GUI(self, a):

        temp = self.parent_conn.recv()

        print(temp)

        if temp == "new":
            self.downloading = True
            return
        if self.downloading:
            self.newFile(temp)
            self.downloading = False
            return
        if type(temp) == type({}):
            self.complete = temp['complete']
            if not self.complete:
                status = "{0}//{1} @ {2}  ETA: {3}".format(temp['dl_size'],
                                                      temp['total_size'],temp['speed'],temp['eta'])
                self.stat[-1].text = status
                self.p_bar[-1].value = temp['progress']
                return

        if temp == "end":
            self.event.cancel()
            Clock.schedule_once(exit, 3)

enter image description here

2 个答案:

答案 0 :(得分:0)

我相信您只需要为添加到GridLayout的每个小部件设置高度。例如:

    self.my_grid.add_widget(Label(text=title, size_hint=(1, None), height=50))

您可能需要对要添加的其他小部件执行相同的操作。 GridLayout可以为最初添加的窗口小部件提供更多的空间,但不会比指定的height更加狭窄。

答案 1 :(得分:0)

对kv文件应用以下更改

<Downloading>:
    size: self.size
    my_grid: mygrid
    GridLayout:
        cols: 1
        size_hint_y : None
        row_default_height: '25dp'
        row_force_default: True
        id: mygrid

并将此行添加到构造函数(__init__)的末尾,它按预期工作。

self.my_grid.bind(minimum_height=self.my_grid.setter('height'))