Как получить разрешение монитора в Python? - PullRequest
85 голосов
/ 28 июня 2010

Какой самый простой способ получить разрешение монитора (желательно в кортеже)?

Ответы [ 25 ]

96 голосов
/ 28 июня 2010

В Windows вы также можете использовать ctypes с GetSystemMetrics():

import ctypes
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

чтобы вам не нужно было устанавливать пакет pywin32; ему не нужно ничего, что не поставляется с самим Python.

Для настроек нескольких мониторов вы можете получить объединенную ширину и высоту виртуального монитора:

import ctypes
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(78), user32.GetSystemMetrics(79)
62 голосов
/ 01 июля 2015

Я создал PyPI модуль по этой причине:

pip install screeninfo

Код:

from screeninfo import get_monitors
for m in get_monitors():
    print(str(m))

Результат:

monitor(1920x1080+1920+0)
monitor(1920x1080+0+0)

Поддерживает мультимониторные среды . Его цель - быть кроссплатформенным; на данный момент он поддерживает Cygwin и X11, но запросы на тягу приветствуются.

53 голосов
/ 28 июня 2010

В Windows:

from win32api import GetSystemMetrics

print("Width =", GetSystemMetrics(0))
print("Height =", GetSystemMetrics(1))

Если вы работаете с экраном с высоким разрешением, убедитесь, что ваш интерпретатор Python имеет HIGHDPIAWARE.

На основе этой записи.

42 голосов
/ 28 июня 2010

Если вы используете wxWindows, вы можете просто сделать:

import wx

app = wx.App(False) # the wx.App object must be created first.    
print(wx.GetDisplaySize())  # returns a tuple
35 голосов
/ 13 мая 2013

Взят прямо из ответа на этот пост: Как получить размер экрана в Tkinter?

import tkinter as tk

root = tk.Tk()

screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
19 голосов
/ 24 октября 2014

В Windows 8.1 я не получаю правильное разрешение от ctypes или tk. У других людей такая же проблема для ctypes: getsystemmetrics возвращает неправильный размер экрана Чтобы получить правильное полное разрешение монитора с высоким DPI на Windows 8.1, необходимо вызвать SetProcessDPIAware и использовать следующий код:

import ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]

Полная информация ниже:

Я обнаружил, что это потому, что Windows сообщает масштабированное разрешение. Похоже, что Python по умолчанию является приложением, поддерживающим систему dpi. Типы приложений с поддержкой DPI перечислены здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx#dpi_and_the_desktop_scaling_factor

По сути, вместо отображения контента в полном разрешении монитора, что может привести к уменьшению шрифтов, контент масштабируется до тех пор, пока шрифты не станут достаточно большими.

На моем мониторе я получаю:
Физическое разрешение: 2560 x 1440 (220 DPI)
Заявленное разрешение python: 1555 x 875 (158 DPI)

За этот сайт windows: http://msdn.microsoft.com/en-us/library/aa770067%28v=vs.85%29.aspx Формула для сообщаемого эффективного разрешения системы: (сообщил_px * current_dpi) / (96 т / д) = физический_px

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

import tkinter as tk
root = tk.Tk()

width_px = root.winfo_screenwidth()
height_px = root.winfo_screenheight() 
width_mm = root.winfo_screenmmwidth()
height_mm = root.winfo_screenmmheight() 
# 2.54 cm = in
width_in = width_mm / 25.4
height_in = height_mm / 25.4
width_dpi = width_px/width_in
height_dpi = height_px/height_in 

print('Width: %i px, Height: %i px' % (width_px, height_px))
print('Width: %i mm, Height: %i mm' % (width_mm, height_mm))
print('Width: %f in, Height: %f in' % (width_in, height_in))
print('Width: %f dpi, Height: %f dpi' % (width_dpi, height_dpi))

import ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]
print('Size is %f %f' % (w, h))

curr_dpi = w*96/width_px
print('Current DPI is %f' % (curr_dpi))    

Который вернул:

Width: 1555 px, Height: 875 px
Width: 411 mm, Height: 232 mm
Width: 16.181102 in, Height: 9.133858 in
Width: 96.099757 dpi, Height: 95.797414 dpi
Size is 2560.000000 1440.000000
Current DPI is 158.045016

Я использую Windows 8.1 с монитором с разрешением 220 точек на дюйм. Моё масштабирование экрана устанавливает мой текущий DPI на 158.

Я буду использовать 158, чтобы убедиться, что мои графики matplotlib имеют правильный размер с: из pylab import rcParams rcParams ['figure.dpi'] = curr_dpi

15 голосов
/ 28 июня 2010

А для полноты, Mac OS X

import AppKit
[(screen.frame().size.width, screen.frame().size.height)
    for screen in AppKit.NSScreen.screens()]

предоставит вам список кортежей, содержащих все размеры экрана (если присутствует несколько мониторов)

13 голосов
/ 04 июля 2013

Если вы используете Qt инструментарий конкретно PySide, вы можете сделать следующее:

from PySide import QtGui
import sys

app = QtGui.QApplication(sys.argv)
screen_rect = app.desktop().screenGeometry()
width, height = screen_rect.width(), screen_rect.height()
12 голосов
/ 12 мая 2014

Вот небольшая небольшая программа на Python, которая отобразит информацию о настройке вашего монитора:

import gtk

window = gtk.Window()

# the screen contains all monitors
screen = window.get_screen()
print "screen size: %d x %d" % (gtk.gdk.screen_width(),gtk.gdk.screen_height())

# collect data about each monitor
monitors = []
nmons = screen.get_n_monitors()
print "there are %d monitors" % nmons
for m in range(nmons):
  mg = screen.get_monitor_geometry(m)
  print "monitor %d: %d x %d" % (m,mg.width,mg.height)
  monitors.append(mg)

# current monitor
curmon = screen.get_monitor_at_window(screen.get_active_window())
x, y, width, height = monitors[curmon]
print "monitor %d: %d x %d (current)" % (curmon,width,height)  

Вот пример ее вывода:

screen size: 5120 x 1200
there are 3 monitors
monitor 0: 1600 x 1200
monitor 1: 1920 x 1200
monitor 2: 1600 x 1200
monitor 1: 1920 x 1200 (current)
12 голосов
/ 28 июня 2010

В Linux самый простой способ - выполнить команду bash

xrandr | grep '*'

и проанализировать ее вывод с помощью regexp.

Также вы можете сделать это через PyGame: http://www.daniweb.com/forums/thread54881.html

...