Избегайте дублирования, вызванного динамическим изменением размера в Kivy - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над GridLayout (здесь он называется CostosInput), который добавляет TextInputs к себе при нажатии кнопки.Однако, когда это происходит, макет не изменяет размеры виджетов вокруг него, что приводит к его перекрытию после добавления определенного количества TextInput виджетов.Как я могу это исправить?

Это часть другого GridLayout, который имеет один столбец и содержится в ScrollView.Виджет под ним (тот, с которым он перекрывается) - Label.

Я пробовал искать в документах Kivy, но единственное, что я нашел, связано с размером Layoutsи Widgets, и не обязательно их размещение.Я думал, что это будет что-то вроде layout_hint_with_bounds(sh_sum, available_space, min_bounded_size, sh_min_vals, sh_max_vals, hint) (ссылка на документы Kivy) , но это внутренняя функция.Я извиняюсь, если что-то не соответствует соглашению.

Вот код для класса CostoInput.

class CostosInput(GridLayout):
def __init__(self, *args, **kwargs):
    super(CostosInput, self).__init__()
    self.cols = 2
    self.spacing = 5
    self.padding = 5
    self.size_hint_y = 0.2

    # used in add_lines()
    self.count = 1

    add = Orange_Button(text='AGREGAR COSTO')
    add.bind(on_press=self.add_lines)

    rem = Orange_Button(text='QUITAR COSTO')
    rem.bind(on_press=self.del_lines)

    self.add_widget(add)
    self.add_widget(rem)

    self.add_widget(Orange_Label(text='concepto'))
    self.add_widget(Orange_Label(text='costo'))

    self.add_lines()

# this function is adds TextInputs
# when the add button is pressed
def add_lines(self, *args, **kwargs):
    text = Normal_TI()
    text.text = 'costo ' + str(self.count)
    text.bind(text=self.change)
    flot = FloatInput()
    flot.bind(text=self.change)
    self.add_widget(text)
    self.add_widget(flot)
    self.size_hint_y += 0.1

    self.count += 1

# this has nothing to do with the ui
def del_lines(self, *args, **kwargs):
    for x in range(0, len(self.children) - 4, 2):
        if len(self.children) > 4:
            try:
                if self.children[x].focus or self.children[x + 1].focus:
                    self.remove_widget(self.children[x])
                    self.remove_widget(self.children[x])
            except Exception as err:
                print('del lines: no se pudieron quitar,'
                      'err {}'.format(err))

# this also has nothing to do with the ui
def change(self, value, *args):
    dicto = dict()
    for x in range(0, len(self.children) - 4, 2):
        dicto[self.children[x + 1].text] = self.children[x].text
    print(dicto)
    producto.costos = dicto

Вот код для класса, с которым был создан экземпляр метки.Атрибут текста - единственная изменяемая часть.

class Orange_Label(Label):
def __init__(self, *args, **kwargs):
    super(Orange_Label, self).__init__(*args, **kwargs)
    self.size_hint_y = None
    self.size = (self.width, 10)
    self.color = (0.95668627451, 0.6941176471, 0.5137254902, 1)
...