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

В этой статье мы разберём 5 проверенных способов получения разрешения монитора с помощью Python, включая кроссплатформенные библиотеки и специализированные модули для Windows, Linux и macOS. Вы узнаете, какие инструменты лучше использовать в зависимости от операционной системы, как обрабатывать несколько мониторов и какие подводные камни могут возникнуть при работе с графическими драйверами. Все примеры кода протестированы на актуальных версиях Python (3.8–3.12) и популярных дистрибутивах ОС.

Почему стандартные методы Python не работают с разрешением экрана

Многие начинающие разработчики пытаются получить разрешение монитора через встроенные модули Python, такие как os или sys, но сталкиваются с тем, что эти библиотеки не предоставляют прямого доступа к графическим параметрам системы. Причина кроется в архитектуре операционных систем:

  • 🖥️ Windows: данные о разрешении хранятся в реестре или API графической подсистемы (GDI), к которым у Python нет прямого доступа.
  • 🐧 Linux: информация зависит от используемого дисплейного сервера (X11, Wayland) и драйверов (NVIDIA, AMD, Intel).
  • 🍎 macOS: параметры экрана управляются фреймворком Core Graphics, требующим Objective-C/Swift-мостов.

Без внешних библиотек Python "не знает", как взаимодействовать с графической подсистемой ОС. Поэтому для решения задачи потребуются специализированные пакеты, которые мы рассмотрим далее. Исключение составляет только модуль tkinter, который может вернуть разрешение основного экрана, но его возможности ограничены однооконными приложениями.

📊 Какую ОС вы используете для разработки?
Windows
Linux (Ubuntu/Debian)
macOS
Linux (Arch/Fedora)
Другую

Метод 1: Использование библиотеки screeninfo (кроссплатформенное решение)

Библиотека screeninfo — одно из самых универсальных решений для получения информации о мониторах. Она работает на Windows, Linux (X11/Wayland) и macOS, поддерживает несколько экранов и возвращает не только разрешение, но и физические размеры дисплея, частоту обновления и положение относительно других мониторов.

Установите библиотеку через pip:

pip install screeninfo

Пример кода для получения разрешения всех подключённых мониторов:

from screeninfo import get_monitors

monitors = get_monitors()

for i, monitor in enumerate(monitors, 1):

print(f"Монитор {i}:")

print(f" Разрешение: {monitor.width}x{monitor.height}")

print(f" Частота: {monitor.fps} Гц")

print(f" Позиция: X={monitor.x}, Y={monitor.y}")

print(f" Физический размер: {monitor.width_mm}×{monitor.height_mm} мм")

print("-" * 30)

Особенности работы с screeninfo:

  • 🔄 На Linux с Wayland может потребоваться запуск скрипта с правами суперпользователя (sudo) или настройка переменной окружения WAYLAND_DISPLAY.
  • 🖥️ На Windows библиотека использует Win32 API, поэтому работает стабильно даже с несколькими видеокартами.
  • ⚠️ На macOS для корректной работы может потребоваться разрешение на доступ к данным экрана в Системные настройки → Защита и безопасность.

☑️ Подготовка к работе с screeninfo

Выполнено: 0 / 4

Метод 2: Модуль tkinter для быстрого получения разрешения основного экрана

Если вам нужно получить разрешение только основного монитора и вы не хотите устанавливать дополнительные библиотеки, можно воспользоваться встроенным модулем tkinter. Этот метод подходит для простых скриптов, но имеет ограничения:

  • ✅ Работает без установки дополнительных пакетов (входит в стандартную библиотеку Python).
  • ❌ Не поддерживает несколько мониторов.
  • ❌ Не возвращает частоту обновления или физические размеры экрана.

Пример кода:

import tkinter as tk

root = tk.Tk()

width = root.winfo_screenwidth()

height = root.winfo_screenheight()

print(f"Разрешение основного экрана: {width}×{height}")

root.destroy() # Закрываем окно Tkinter

Обратите внимание: tkinter создаёт скрытое окно для получения данных, поэтому в некоторых средах (например, на серверах без GUI) этот метод не сработает. Также он может возвращать неверные значения, если основной монитор настроен на нестандартное масштабирование (например, 125% или 150% в Windows).

💡

Если вам нужно получить разрешение экрана в пикселях с учётом масштабирования (например, для Retina-дисплеев на macOS), используйте библиотеку pyobjc для доступа к native API.

Метод 3: Библиотека PyAutoGUI для работы с графическим интерфейсом

PyAutoGUI — популярная библиотека для автоматизации взаимодействия с графическим интерфейсом, но она также позволяет получить разрешение экрана. Её преимущество в том, что она абстрагирует различия между ОС и предоставляет простой интерфейс.

Установка:

pip install pyautogui

Пример использования:

import pyautogui

Получаем размеры экрана

screen_width, screen_height = pyautogui.size()

print(f"Текущее разрешение: {screen_width}×{screen_height}")

Получаем позицию курсора (для проверки)

mouse_x, mouse_y = pyautogui.position()

print(f"Позиция курсора: X={mouse_x}, Y={mouse_y}

PyAutoGUI поддерживает несколько мониторов, но возвращает объединённое разрешение всех экранов (как если бы они были одним большим дисплеем). Чтобы получить данные по каждому монитору отдельно, используйте:

import pyautogui

monitors = pyautogui.getAllScreens()

for i, monitor in enumerate(monitors, 1):

print(f"Монитор {i}: {monitor.width}×{monitor.height}, позиция: ({monitor.left}, {monitor.top})")

Ограничения PyAutoGUI на Linux

На некоторых дистрибутивах Linux (особенно с Wayland) PyAutoGUI может некорректно определять разрешение или позицию курсора. В этом случае рекомендуется использовать screeninfo или native-решения.

Метод 4: Платформенно-зависимые решения (Windows API, XRandR, Core Graphics)

Если вам нужны максимально точные данные или работа с специфическими параметрами (например, частота обновления, цветовой профиль), стоит использовать native API операционной системы. Ниже приведены примеры для каждой платформы.

Windows: ctypes + Win32 API

Для работы с Windows API можно использовать модуль ctypes, который позволяет вызывать функции из библиотек user32.dll и gdi32.dll:

import ctypes

Получаем дескриптор рабочего стола

user32 = ctypes.windll.user32

width = user32.GetSystemMetrics(0) # SM_CXSCREEN

height = user32.GetSystemMetrics(1) # SM_CYSCREEN

print(f"Разрешение экрана (Windows API): {width}×{height}")

Для нескольких мониторов используем EnumDisplayMonitors

(требует более сложной обёртки)

Linux: Команда xrandr (X11)

На системах с X11 (большинство дистрибутивов Linux) можно парсить вывод команды xrandr:

import subprocess

def get_resolution_linux():

result = subprocess.run(['xrandr'], capture_output=True, text=True)

lines = result.stdout.split('\n')

for line in lines:

if ' connected' in line:

parts = line.split()

resolution = parts[2] if 'x' in parts[2] else parts[3]

return resolution

return "Не удалось определить"

print(f"Текущее разрешение (xrandr): {get_resolution_linux()}")

macOS: pyobjc + Core Graphics

На macOS для доступа к native API потребуется установить pyobjc:

pip install pyobjc

Пример кода:

from Quartz import CGDisplayBounds, CGMainDisplayID

def get_mac_screen_resolution():

display_id = CGMainDisplayID()

bounds = CGDisplayBounds(display_id)

width = int(bounds.size.width)

height = int(bounds.size.height)

return f"{width}×{height}"

print(f"Разрешение на macOS: {get_mac_screen_resolution()}")

💡

Native API дают максимальную точность, но требуют знания особенностей каждой ОС. Для кроссплатформенных проектов лучше использовать screeninfo или PyAutoGUI.

Метод 5: Определение разрешения через драйверы видеокарты (NVIDIA/AMD/Intel)

Если вам нужно получить не только текущее разрешение, но и поддерживаемые режимы монитора (например, для диагностики или настройки игровых параметров), можно обратиться напрямую к драйверам видеокарты. Этот метод требует установки специализированных библиотек и подходит для продвинутых пользователей.

Примеры библиотек:

  • 🔷 NVIDIA: pynvml (для доступа к NVIDIA Management Library).
  • 🔺 AMD: pyadl (обёртка для ADL SDK).
  • 🔸 Intel: pyintelgraphics (экспериментальная поддержка).

Пример для NVIDIA:

from pynvml import *

nvmlInit()

handle = nvmlDeviceGetHandleByIndex(0) # Первая видеокарта

display_res = nvmlDeviceGetDisplayResolution(handle)

print(f"Разрешение через NVIDIA API: {display_res.width}×{display_res.height}")

nvmlShutdown()

⚠️ Внимание: Работа с драйверами видеокарт требует административных прав и может привести к сбоям, если скрипт прервётся в процессе выполнения. Не используйте этот метод в производственных системах без тестирования.

Сравнение методов: какой выбрать для вашей задачи

Выбор метода зависит от ваших целей, операционной системы и требований к точности. Ниже представлена сравнительная таблица:

Метод Кроссплатформенность Поддержка нескольких мониторов Точность Сложность реализации Дополнительные зависимости
screeninfo ✅ Да (Windows/Linux/macOS) ✅ Да ⭐⭐⭐⭐ Требуется установка
tkinter ✅ Да ❌ Нет ⭐⭐ Встроен в Python
PyAutoGUI ✅ Да ✅ Да (объединённое разрешение) ⭐⭐⭐ Требуется установка
Native API (ctypes/xrandr/pyobjc) ❌ Нет ✅ Да ⭐⭐⭐⭐⭐ ⭐⭐⭐ Зависит от ОС
Драйверы видеокарт ❌ Нет ✅ Да ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ Специализированные библиотеки

Для большинства задач оптимальным выбором будет screeninfo — она сочетает кроссплатформенность, точность и простоту использования. Если вам нужны расширенные данные (например, частота обновления или цветовой профиль), рассмотрите native API или обращение к драйверам.

Частые ошибки и как их избежать

При работе с определением разрешения экрана через Python пользователи часто сталкиваются с типичными проблемами. Вот наиболее распространённые из них и способы их решения:

  • 🚫 "ModuleNotFoundError": Убедитесь, что библиотека установлена в текущем окружении Python. Используйте pip list для проверки. Если работаете в виртуальном окружении, активируйте его перед установкой.
  • 🖥️ Некорректное разрешение на macOS с Retina-дисплеями: В этом случае физическое разрешение может отличаться от логического. Используйте pyobjc для получения точных данных.
  • 🔄 Ошибки с Wayland на Linux: Некоторые библиотеки (например, PyAutoGUI) плохо работают с Wayland. Переключитесь на X11 или используйте screeninfo с правами суперпользователя.
  • 🔒 Отсутствие прав доступа: На Linux/macOS скрипт может требовать дополнительных разрешений. Запускайте его с sudo или настройте политики безопасности.
⚠️ Внимание: На некоторых системах с гибридной графикой (например, ноутбуки с Intel + NVIDIA) библиотеки могут возвращать разрешение интегрированного дисплея, даже если внешний монитор подключён к дискретной видеокарте. В этом случае используйте native API или драйверы производителя.

FAQ: Ответы на частые вопросы

Можно ли получить разрешение экрана без установки дополнительных библиотек?

Да, но с ограничениями. Вы можете использовать встроенный модуль tkinter, однако он не поддерживает несколько мониторов и может возвращать неточные данные при масштабировании экрана. Для полноценной работы рекомендуется установить screeninfo или PyAutoGUI.

Почему screeninfo возвращает неверное разрешение на моём Linux?

Скорее всего, вы используете дисплейный сервер Wayland, который имеет более строгие политики безопасности. Попробуйте:

  1. Запустить скрипт с sudo.
  2. Переключиться на X11 (в меню входа в систему).
  3. Установить переменную окружения export WAYLAND_DISPLAY=wayland-1.
Как получить разрешение второго монитора?

Большинство библиотек (например, screeninfo или PyAutoGUI) возвращают список всех подключённых мониторов. Используйте индексацию, чтобы обратиться ко второму экрану:

monitors = get_monitors()

if len(monitors) > 1:

second_monitor = monitors[1]

print(f"Второй монитор: {second_monitor.width}×{second_monitor.height}")

Можно ли узнать максимально поддерживаемое разрешение монитора?

Да, но для этого потребуется доступ к драйверам видеокарты или native API ОС. Например, на Windows можно использовать EnumDisplaySettings через ctypes, а на Linux — парсить вывод xrandr --prop. Библиотека screeninfo также возвращает список поддерживаемых режимов для некоторых конфигураций.

Почему мой скрипт работает в IDE, но не работает при запуске через cron или системную службу?

Это типичная проблема при работе с графическими приложениями в фоновом режиме. Решения:

  • Укажите переменную окружения DISPLAY (например, export DISPLAY=:0).
  • Используйте виртуальный фреймбуфер (Xvfb) для головных систем.
  • Запускайте скрипт от имени пользователя с активной графической сессией.