Kivy Layout Issue - PullRequest
       8

Kivy Layout Issue

0 голосов
/ 13 января 2019

Я пытаюсь создать графический интерфейс с использованием Kivy. Однако я не могу решить некоторые проблемы с форматированием. Вот уменьшенная версия моего файла KV:

BoxLayout:
    MainCanvas:
        size_hint: 1,1
        size: (root.width,root.height*.9)
        DoubleEllipseWidget:
        ActionBar:
            id: _action
            size_hint: 1,0.1
            size: (root.width,root.height*.1)
            pos_hint: {'bottom':1}
            ActionView:
                use_separator: True
                ActionPrevious:
                    title: 'Test App:'
                    with_previous: False
                ActionOverflow:
                    disabled: True
                ActionButton:
                    important: True
                    text: 'Button 1'
                    #on_release: some_function
                ActionButton:
                    text: 'Button 2'
                    #on_release: some_function
                ActionButton:
                    text: 'Button 3'
                    #on_release: some_function


<DoubleEllipseWidget>
    size: [200, 200]
    canvas:
        Color:
            rgba: 0, 0, 0, 1
        Ellipse
            size: [198, 198]
            pos: [600-200-100, 800-200-100]
        Color:
            rgba: 1, 1, 1, 1
        Ellipse
            size: [200, 200]
            pos: [600-200-100, 800-200-100]
    TextInput:
        on_parent:self.focus = True
        text: 'center of circle'
        background_color: (0,0,0,0)
        foreground_color: (0,0,0,1)

То, к чему я пытаюсь добраться, очень легко объяснить.

По сути, должна быть строка меню, идущая горизонтально вдоль экранного окна (10% от общей высоты и 100% от ширины). Я верю, что сделал это.

Оставшиеся 95% высоты должны быть основным холстом - я думаю, что я тоже это сделал.

Последняя часть - получение определенного виджета для размещения в центре основного холста. Вот где я застрял и был бы признателен за помощь.

Виджет, который мне нужно центрировать, состоит из двух кругов (один центрирован поверх другого, причем один немного меньше другого). Затем поверх самого верхнего круга должен быть TextInput.

1 Ответ

0 голосов
/ 13 января 2019

Получив совет от этого сообщества, я отбросил всю логику, пока у меня не осталось только основ (определения классов и макета), и у меня все еще были проблемы.

Однако теперь я узнал, что то, что я предполагал, было проблемой макета, скорее всего, нет. Отчет об ошибках Kivy, последний раз прокомментированный в ноябре 2018 года (проблема фокуса TextInput # 3863), предполагает наличие необъяснимых случаев, когда текстовые входы могут потерять фокус. Ниже предложен обходной путь, который также работал для меня. Спасибо за тех, кто пытался мне помочь.

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.popup import Popup
    from kivy.uix.textinput import TextInput
    from kivy.lang import Builder

    Builder.load_string('''
    <Base>:
    Button:
        text: 'Press for Popup'
        on_press: root.edit_text()

    <TextInputX>
    id: texter
    keyboard_mode: 'managed'
    is_focusable: True
    focus: True
    keyboard_on_key_down:
        texter.show_keyboard()
''')


class Base(BoxLayout):
    def __init__(self, **kwargs):
        super(Base, self).__init__(**kwargs)

    def edit_text(self, *args):
        self.clear_widgets()
        content = TextInputX()
        # content.focus = True
        popup = Popup(content=content)
        popup.open()


class TextInputX(TextInput):
    def __init__(self, **kwargs):
        super(TextInputX, self).__init__(**kwargs)
        # self.focus = True


class SampleApp(App):
    def build(self):
        return Base()


if __name__ == '__main__':
    SampleApp().run()
...