Проблема
Как разрешить Kivy использовать одно и то же измерение пикселей для создания Window
и Screen
на устройствах с дисплеем Retina?
Описание
Пиксель измерения для Window
и Screen
не совпадают на дисплее Retina от Apple. Ширина и высота a Window
всегда вдвое длиннее входных значений. Кажется, Window
использует 1 логический пиксель как 1 единицу, а Screen
и его дочерние элементы используют 1 физический пиксель как 1 единицу
Apple называет этот режим режимом HiDPI. Проще говоря, это один логический пиксель = четыре физических пикселя в самом начале. Wikipedia .
Пример кода
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()
<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
каким-то образом информация о первоначальном размере преобразуется в информацию на основе физических пикселей.