Как добавить новый виджет в GridLayout без изменения размера старых виджетов? - PullRequest
0 голосов
/ 30 мая 2019

Я добавил GridLayout в ScrollView, и я динамически добавляю виджеты в GridLayout из программы на python. Вместо того, чтобы использовать больше места в окне, он изменяет высоту старых виджетов. Что я здесь не так делаю?

Я пытался поместить BoxLayout в GridLayout, но он не работает. Я также попытался добавить виджеты непосредственно в ScrollView, но обнаружил, что ScrollView поддерживает только один виджет.

Мой код кв:

<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 голосов
/ 30 мая 2019

После внесения следующих изменений в файл 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'))
0 голосов
/ 30 мая 2019

Я считаю, что вам просто нужно установить высоту для каждого виджета, который вы добавляете в GridLayout. Например:

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

Возможно, вам придется сделать то же самое для других виджетов, которые вы добавляете. GridLayout может дать первоначально добавленным виджетам больше места, чем это, но не будет сжимать их сильнее, чем указано вами height.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...