Python кивы - различное масштабирование и позиционирование виджетов и изображений на разных устройствах - PullRequest
0 голосов
/ 24 января 2020

В настоящее время мы работаем в группе над проектом python - kivy, где мы разрабатываем приложение, которое мы стремимся опубликовать sh для iOS - с использованием XCode. Проблема, с которой мы сталкиваемся на данный момент, заключается в том, что GUI, который мы создали с помощью kivy, масштабирует и позиционирует объекты по-разному на наших устройствах. Мы используем Windows и macOS в нашей группе (обе используют одну и ту же Python версию 3.7.5 и kivy 1.11.1). Странная вещь здесь в том, что даже между двумя нашими macOS-устройствами некоторые виджеты, например TextInput, Spinner images, масштабируются по-разному.

«Плохие» виджеты, на которые влияют, не пишутся так же, как виджеты, у которых, похоже, нет проблем. Особенно размер Kivy Popups очень грязный. На одном Macbook он занимает примерно половину экрана, а на другом MacBook - весь экран, что делает невозможным закрытие Popup, что приводит к сбоям в работе приложения.

Таким образом, это практически невозможно работать над таким проектом в группе, когда в основном только один человек может завершить sh все корректировки. Есть ли какие-либо решения или предложения о том, как подойти к этому вопросу? Мы уже включили параметр Window.size и отключили возможность изменять размер окна предварительного просмотра, чтобы иметь одинаковое разрешение на всех устройствах. Это пример одного из файлов .kv, где пользовательские изображения для прядильщиков масштабируются по-разному, а текстовые строки располагаются совершенно по-разному на всех наших устройствах. Для примера я удалил все функции (on_release, ids et c.), Так как они не должны влиять на форматирование. Создание экрана (сверху вниз): 2 счетчика, 1 ввод текста, 3 кнопки, панель навигации вкл. 2 кнопки.

<EditLocation>:
    FloatLayout:
        #Background color
        canvas:
            Rectangle:
                size: self.size
                pos: self.pos
                source: "graphics/background/background_main.png"

        #Display of ID and input fields
        GridLayout:
            cols: 1
            size_hint: 1, .25
            pos_hint: {"top": 1, "right": 1}
            GridLayout:
                cols: 2
                SpinnerWidget:
                    text: "Select Country"
                    background_normal: 'graphics/buttons/dropdown_country.png'
                    background_down: 'graphics/buttons/dropdown_country_pressed.png'
                SpinnerWidget:
                    text: "Select City"
                    background_normal: 'graphics/buttons/dropdown_city.png'
                    background_down: 'graphics/buttons/dropdown_city_pressed.png'
            Label:
                text: "Location"
            TextInput:
                hint_text: "Name of Location"
                multiline: False
                canvas.before:
                    Color:
                        rgba: 1, 1, 1, 1
                    Line:
                        points: self.x + 5, self.y +30, self.x + self.width, self.y +30
                        width: 1
        #Delete and Update
        GridLayout:
            cols: 3
            pos_hint: {"top": .22, "right": 1}
            size_hint: 1, .2
            ImageButton:
                source: "graphics/buttons/delete.png" if self.state == 'normal' else "graphics/buttons/delete_pressed.png"
            ImageButton:
                source: "graphics/buttons/update.png" if self.state == 'normal' else "graphics/buttons/update_pressed.png"
            ImageButton:
                source: "graphics/buttons/undo.png" if self.state == 'normal' else "graphics/buttons/undo_pressed.png"
        #Navigation Bar Background
        LabelButton:
            pos_hint: {"top": .0925, "right": 1}
            size_hint: 1, .1
            canvas.before:
                Color:
                    rgb: utils.get_color_from_hex("#fafafa")
                Rectangle:
                    size: self.size
                    pos: self.pos
        #Navigation Bar (5 Image Buttons)
        GridLayout:
            cols: 2
            pos_hint: {"top": .0825, "right": 1}
            size_hint: 1, .0725
            ImageButton:
                source: "graphics/navigation/add_person.png" if self.state == 'normal' else "graphics/navigation/add_person_pressed.png"
            ImageButton:
                source: "graphics/navigation/back.png" if self.state == 'normal' else "graphics/navigation/back_pressed.png"

Мы работаем с PyCharm, где проблемы появляются в окне предварительного просмотра. Спасибо!

...