Проблема измерения пикселей в Kivy, вызванная дисплеем Retina от Apple - PullRequest
0 голосов
/ 23 февраля 2020

Проблема

Как разрешить Kivy использовать одно и то же измерение пикселей для создания Window и Screen на устройствах с дисплеем Retina?

Описание

Пиксель измерения для Window и Screen не совпадают на дисплее Retina от Apple. Ширина и высота a Window всегда вдвое длиннее входных значений. Кажется, Window использует 1 логический пиксель как 1 единицу, а Screen и его дочерние элементы используют 1 физический пиксель как 1 единицу

Apple называет этот режим режимом HiDPI. Проще говоря, это один логический пиксель = четыре физических пикселя в самом начале. Wikipedia .

Пример кода

  • Следующий код создает размер (500, 500) Window и Screen с предположительно одинакового размера. Внутри этого Screen создаются Button в верхнем правом углу и 500 на 500 Rectangle. Button показывает размер Screen и другую информацию при нажатии.

  • main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.config import Config
from kivy.metrics import Metrics

Config.set("graphics", "width", 500)
Config.set("graphics", "height", 500)

dpi_info = Metrics.dpi
pixel_density_info = Metrics.density

print("Before app starts, dpi is ", dpi_info)
print("Before app starts, pixel density is ", pixel_density_info)


class AppScreen(Screen):

    @staticmethod
    def show_metrics_data():
        print("when app is running, dpi is ", dpi_info)
        print("when app is running, pixel density is ", pixel_density_info)


class MainApp(App):
    def build(self):
        app_screen = AppScreen()
        return app_screen


if __name__ == '__main__':
    app = MainApp()
    app.run()

  • main.kv
<AppScreen>
    Button:
        on_press:
            print(root.size)
            root.show_metrics_data()

Результаты

  • При нажатии Button, который показывает размер экрана, печатается [1000, 1000] вместо [500, 500].
  • 500 на 500 Rectangle имеет только половину ширины и высоты по сравнению с Window, который также настроен на 500 на 500.
  • До запуска приложения и когда приложение работает, возвращаются одинаковые значения для точек на дюйм и плотности пикселей, с dpi, равным 192,0, и плотностью пикселей, равной 2,0 для обоих случаев. Результат

edit :

  • При подключении моего текущего устройства отображения Retina к монитору, на котором нет дисплея Retina, и установке этого монитора на главный экран , все работает так, как ожидается при запуске код. Размеры Screen, Window и Rectangle имеют размер 500 на 500, а Rectangle заполняет все Screen, а не только его часть. Результат

edit :

  • Интересно, что если я добавлю вышеупомянутый результат на дисплей Retina, он внезапно будет выглядеть так: Result

Возможные причины

В настоящее время единственная возможная причина, о которой я могу подумать, заключается в том, что размер Window создается на основе логических пикселей, а Screen принимает этот созданный размер. Однако при создании виджетов, выполнении инструкций рисования холста или получении значений размера Screen каким-то образом информация о первоначальном размере преобразуется в информацию на основе физических пикселей.

...