programing

파이썬에서 모니터 해상도를 얻으려면 어떻게 해야 합니까?

megabox 2023. 6. 18. 12:29
반응형

파이썬에서 모니터 해상도를 얻으려면 어떻게 해야 합니까?

모니터 해상도를 얻는 가장 간단한 방법은 무엇입니까(최적은 튜플)?

다음과 같은 이유로 PyPI 모듈을 만들었습니다.

pip install screeninfo

코드:

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

결과:

Monitor(x=3840, y=0, width=3840, height=2160, width_mm=1420, height_mm=800, name='HDMI-0', is_primary=False)
Monitor(x=0, y=0, width=3840, height=2160, width_mm=708, height_mm=399, name='DP-0', is_primary=True)

다중 모니터 환경을 지원합니다.크로스 플랫폼이 목표입니다. 현재는 Cygwin과 X11을 지원하지만 풀 요청은 전적으로 환영합니다.

윈도우즈에서는 다음과 함께 ctype을 사용할 수도 있습니다.

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)

Windows의 경우:

from win32api import GetSystemMetrics

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

고해상도 화면으로 작업하는 경우 파이썬 인터프리터가 HIGHDPIAWARE인지 확인합니다.

이 게시물을 기준으로 합니다.

게시물에 대한 답변에서 직접 따옴 Tkinter에서 화면 크기를 얻으려면 어떻게 해야 합니까?,

import tkinter as tk

root = tk.Tk()

screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

wxWindows(wxPython 설치)를 사용하는 경우 다음 작업을 간단히 수행할 수 있습니다.

import wx

app = wx.App(False) # the wx.App object must be created first.    
print(wx.GetDisplaySize())  # returns a tuple

Windows 8.1에서는 ctypes 또는 tk에서 올바른 해상도를 얻지 못합니다.다른 사람들도 ctypes에서 동일한 문제를 겪고 있습니다. get system metrics에서 잘못된 화면 크기를 반환합니다.

Windows 8.1에서 DPI가 높은 모니터의 전체 해상도를 얻으려면 SetProcess를 호출해야 합니다.DPIAware 및 사용 코드:

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

아래의 전체 세부 정보:

Windows에서 배율이 조정된 해상도를 보고하기 때문이라는 것을 알게 되었습니다.python은 기본적으로 '시스템 dpi 인식' 응용 프로그램인 것으로 보입니다.DPI 인식 응용 프로그램 유형은 다음과 같습니다.Windows에서의 높은 DPI 데스크톱 애플리케이션 개발

기본적으로 글꼴을 작게 만드는 전체 모니터 해상도를 콘텐츠에 표시하는 대신 글꼴이 충분히 커질 때까지 콘텐츠의 크기가 조정됩니다.

모니터에 다음 메시지가 표시됩니다.
해상도: x 파일: 2560 x 1440 (220DPI)
보고된 파이썬 해상도: 1555 x 875 (158 DPI)

다음 Windows 사이트별:높은 DPI 화면에 대한 척도 조정.보고된 시스템 유효 해결 공식은 다음과 같습니다.

(syslog_syslog*current_dpi)/(96dpi) = physical_proxy

아래 코드로 정확한 전체 화면 해상도와 현재 DPI를 얻을 수 있습니다.SetProcess를 호출합니다.DPIAware() - 프로그램이 실제 해상도를 볼 수 있도록 합니다.

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

220 DPI 지원 모니터로 Windows 8.1을 실행하고 있습니다.디스플레이 스케일링은 현재 DPI를 158로 설정합니다.

158을 사용하여 Matplotlib 그림의 크기가 올바른지 확인합니다.

from pylab import rcParams
rcParams['figure.dpi'] = curr_dpi

완성도를 높이기 위해 Mac OS X

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

모든 화면 크기를 포함하는 튜플 목록을 제공합니다(여러 모니터가 있는 경우).

크로스 플랫폼을 사용하고 이를 위한 쉬운 방법은 거의 모든 Python 버전과 함께 제공되는 Tkinter를 사용하는 것이므로 다음을 설치할 필요가 없습니다.

import tkinter
root = tkinter.Tk()
root.withdraw()
WIDTH, HEIGHT = root.winfo_screenwidth(), root.winfo_screenheight()

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()

오래된 질문이지만 이것은 누락되었습니다.저는 파이썬이 처음이라 이것이 "나쁜" 해결책인지 알려주세요.이 솔루션은 Windows 및 MacOS에서만 지원되며 기본 화면에서만 작동하지만 OS는 질문에 언급되지 않았습니다.

스크린샷을 찍어 크기를 측정합니다.화면 크기가 변경되면 안 되므로 이 작업은 한 번만 수행해야 합니다.GTK, wx, ...와 같은 GUI 툴킷이 설치되어 있으면 더욱 우아한 솔루션이 있습니다.

베개 참조

pip install Pillow

from PIL import ImageGrab

img = ImageGrab.grab()
print (img.size)

Tkinter(Python 2/3의 코드)를 사용하여 다중 화면 설정에서 현재 화면 크기를 얻으려면 @user2366975의 답변을 확장합니다.

try:
    # for Python 3
    import tkinter as tk
except ImportError:
    # for Python 2
    import Tkinter as tk


def get_curr_screen_geometry():
    """
    Workaround to get the size of the current screen in a multi-screen setup.

    Returns:
        geometry (str): The standard Tk geometry string.
            [width]x[height]+[left]+[top]
    """
    root = tk.Tk()
    root.update_idletasks()
    root.attributes('-fullscreen', True)
    root.state('iconic')
    geometry = root.winfo_geometry()
    root.destroy()
    return geometry

(Linux에서만 테스트된 교차 플랫폼에서 작동해야 함)

Linux를 사용하는 가장 간단한 방법은 Bash 명령을 실행하는 것입니다.

xrandr | grep '*'

그리고 정규식을 사용하여 출력을 구문 분석합니다.

또한 Pygame을 통해 할 수 있습니다.Pygame - 화면 크기 가져오기

저는 아래와 같은 프로젝트 중 하나에서 get_screen_resolution 방법을 사용하고 있는데, 기본적으로 수입 체인입니다.필요하지 않은 부품을 제거하고 체인에서 더 가능성이 높은 포트를 위로 이동하여 필요에 따라 수정할 수 있습니다.

PYTHON_V3 = sys.version_info >= (3,0,0) and sys.version_info < (4,0,0):
#[...]
    def get_screen_resolution(self, measurement="px"):
        """
        Tries to detect the screen resolution from the system.
        @param measurement: The measurement to describe the screen resolution in. Can be either 'px', 'inch' or 'mm'. 
        @return: (screen_width,screen_height) where screen_width and screen_height are int types according to measurement.
        """
        mm_per_inch = 25.4
        px_per_inch =  72.0 #most common
        try: # Platforms supported by GTK3, Fx Linux/BSD
            from gi.repository import Gdk 
            screen = Gdk.Screen.get_default()
            if measurement=="px":
                width = screen.get_width()
                height = screen.get_height()
            elif measurement=="inch":
                width = screen.get_width_mm()/mm_per_inch
                height = screen.get_height_mm()/mm_per_inch
            elif measurement=="mm":
                width = screen.get_width_mm()
                height = screen.get_height_mm()
            else:
                raise NotImplementedError("Handling %s is not implemented." % measurement)
            return (width,height)
        except:
            try: #Probably the most OS independent way
                if PYTHON_V3: 
                    import tkinter 
                else:
                    import Tkinter as tkinter
                root = tkinter.Tk()
                if measurement=="px":
                    width = root.winfo_screenwidth()
                    height = root.winfo_screenheight()
                elif measurement=="inch":
                    width = root.winfo_screenmmwidth()/mm_per_inch
                    height = root.winfo_screenmmheight()/mm_per_inch
                elif measurement=="mm":
                    width = root.winfo_screenmmwidth()
                    height = root.winfo_screenmmheight()
                else:
                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                return (width,height)
            except:
                try: #Windows only
                    from win32api import GetSystemMetrics 
                    width_px = GetSystemMetrics (0)
                    height_px = GetSystemMetrics (1)
                    if measurement=="px":
                        return (width_px,height_px)
                    elif measurement=="inch":
                        return (width_px/px_per_inch,height_px/px_per_inch)
                    elif measurement=="mm":
                        return (width_px/mm_per_inch,height_px/mm_per_inch)
                    else:
                        raise NotImplementedError("Handling %s is not implemented." % measurement)
                except:
                    try: # Windows only
                        import ctypes
                        user32 = ctypes.windll.user32
                        width_px = user32.GetSystemMetrics(0)
                        height_px = user32.GetSystemMetrics(1)
                        if measurement=="px":
                            return (width_px,height_px)
                        elif measurement=="inch":
                            return (width_px/px_per_inch,height_px/px_per_inch)
                        elif measurement=="mm":
                            return (width_px/mm_per_inch,height_px/mm_per_inch)
                        else:
                            raise NotImplementedError("Handling %s is not implemented." % measurement)
                    except:
                        try: # Mac OS X only
                            import AppKit 
                            for screen in AppKit.NSScreen.screens():
                                width_px = screen.frame().size.width
                                height_px = screen.frame().size.height
                                if measurement=="px":
                                    return (width_px,height_px)
                                elif measurement=="inch":
                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                elif measurement=="mm":
                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                else:
                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                        except: 
                            try: # Linux/Unix
                                import Xlib.display
                                resolution = Xlib.display.Display().screen().root.get_geometry()
                                width_px = resolution.width
                                height_px = resolution.height
                                if measurement=="px":
                                    return (width_px,height_px)
                                elif measurement=="inch":
                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                elif measurement=="mm":
                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                else:
                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                            except:
                                try: # Linux/Unix
                                    if not self.is_in_path("xrandr"):
                                        raise ImportError("Cannot read the output of xrandr, if any.")
                                    else:
                                        args = ["xrandr", "-q", "-d", ":0"]
                                        proc = subprocess.Popen(args,stdout=subprocess.PIPE)
                                        for line in iter(proc.stdout.readline,''):
                                            if isinstance(line, bytes):
                                                line = line.decode("utf-8")
                                            if "Screen" in line:
                                                width_px = int(line.split()[7])
                                                height_px = int(line.split()[9][:-1])
                                                if measurement=="px":
                                                    return (width_px,height_px)
                                                elif measurement=="inch":
                                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                                elif measurement=="mm":
                                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                                else:
                                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                                except:
                                    # Failover
                                    screensize = 1366, 768
                                    sys.stderr.write("WARNING: Failed to detect screen size. Falling back to %sx%s" % screensize)
                                    if measurement=="px":
                                        return screensize
                                    elif measurement=="inch":
                                        return (screensize[0]/px_per_inch,screensize[1]/px_per_inch)
                                    elif measurement=="mm":
                                        return (screensize[0]/mm_per_inch,screensize[1]/mm_per_inch)
                                    else:
                                        raise NotImplementedError("Handling %s is not implemented." % measurement)

다음은 다중 모니터 설정에 대한 정보를 표시하는 빠른 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)

X Window 버전:

#!/usr/bin/python

import Xlib
import Xlib.display

resolution = Xlib.display.Display().screen().root.get_geometry()
print str(resolution.width) + "x" + str(resolution.height)

PyQt4를 설치한 경우 다음 코드를 사용해 보십시오.

from PyQt4 import QtGui
import sys

MyApp = QtGui.QApplication(sys.argv)
V = MyApp.desktop().screenGeometry()
h = V.height()
w = V.width()
print("The screen resolution (width X height) is the following:")
print(str(w) + "X" + str(h))

PyQt5의 경우 다음이 작동합니다.

from PyQt5 import QtWidgets
import sys

MyApp = QtWidgets.QApplication(sys.argv)
V = MyApp.desktop().screenGeometry()
h = V.height()
w = V.width()
print("The screen resolution (width X height) is the following:")
print(str(w) + "X" + str(h))

Linux의 경우:

import subprocess
import re

def getScreenDimensions():
    xrandrOutput = str(subprocess.Popen(['xrandr'], stdout=subprocess.PIPE).communicate()[0])
    matchObj = re.findall(r'current\s(\d+) x (\d+)', xrandrOutput)
    if matchObj:
        return (int(matchObj[0][0]), int(matchObj[0][1]))

screenWidth, screenHeight = getScreenDimensions()
print(f'{screenWidth} x {screenHeight}')

Pyautogui를 사용해 보십시오.

import pyautogui
resolution = pyautogui.size()
print(resolution) 

이러한 답변의 대부분은 화면 높이/폭(해상도)을 찾기 위해 tkinter를 사용하지만 때로는 교차 플랫폼과 호환되는 화면의 dpi를 알아야 합니다. 링크에서 나온 답변이고 다른 게시물에 댓글로 남겼지만 찾는 데 몇 시간이 걸렸습니다.저는 아직 문제가 없지만, 당신의 시스템에서 작동하지 않는다면 알려주세요!

import tkinter
root = tkinter.Tk()
dpi = root.winfo_fpixels('1i')

이에 대한 설명서는 다음과 같습니다.

winfo_fpixels(number)
# Return the number of pixels for the given distance NUMBER (e.g. "3c") as float

거리 번호는 단위 뒤에 오는 숫자이므로 3c는 3cm를 의미하며, 이 함수는 화면의 3cm에 있는 픽셀 수를 제공합니다(여기 참조).그래서 우리는 dpi를 얻기 위해 1인치 화면의 픽셀 수("1i")에 대한 함수를 요청합니다.

파이게임 사용하기:

import pygame
pygame.init()
infos = pygame.display.Info()
screen_size = (infos.current_w, infos.current_h)

[1]

그러나 창을 화면 크기로 설정하려는 경우 다음 작업을 수행할 수 있습니다.

pygame.display.set_mode((0,0),pygame.FULLSCREEN)

디스플레이를 전체 화면 모드로 설정합니다.[2]

Windows OS에서 작업하는 경우 OS 모듈을 사용하여 다음을 얻을 수 있습니다.

import os
cmd = 'wmic desktopmonitor get screenheight, screenwidth'
size_tuple = tuple(map(int,os.popen(cmd).read().split()[-2::]))

튜플(Y,X)을 반환합니다. 여기서 Y는 수직 크기이고 X는 수평 크기입니다.이 코드는 Python 2 및 Python 3에서 작동합니다.

갱신하다

Windows 8/8.1/10의 경우 위의 대답이 작동하지 않습니다. 대신 다음 대답을 사용하십시오.

import os
cmd = "wmic path Win32_VideoController get CurrentVerticalResolution,CurrentHorizontalResolution"
size_tuple = tuple(map(int,os.popen(cmd).read().split()[-2::]))

Linux 사용

정규식 대신 첫 번째 줄을 사용하여 현재 해상도 값을 꺼냅니다.

현재 디스플레이 해상도:0

>>> screen = os.popen("xrandr -q -d :0").readlines()[0]
>>> print screen
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 1920 x 1920
>>> width = screen.split()[7]
>>> print width
1920
>>> height = screen.split()[9][:-1]
>>> print height
1080
>>> print "Current resolution is %s x %s" % (width,height)
Current resolution is 1920 x 1080

이 작업은 xrandr 1.3.5에서 수행되었습니다. 다른 버전에서 출력이 다른지는 모르겠지만, 이렇게 하면 쉽게 파악할 수 있을 것입니다.

게임에 늦었습니다.의존성이 없는 라이브러리를 사용하여 크로스 플랫폼을 찾은 것 같습니다.mss여러 모니터를 지원합니다(https://pypi.org/project/mss/) :

import mss
sct=mss.mss()
sct.monitors

그러면 다음과 같은 것을 얻을 수 있습니다.

[{'left': -1440, 'top': 0, 'width': 4000, 'height': 1080},
 {'left': 0, 'top': 0, 'width': 2560, 'height': 1080},
 {'left': -1440, 'top': 180, 'width': 1440, 'height': 900}]

요소 0은 모든 모니터를 결합한 가상 화면입니다.요소 1은 기본 모니터이고 요소 2는 두 번째 모니터입니다.

픽셀당 비트 수를 가져오는 방법

import ctypes
user32 = ctypes.windll.user32
gdi32 = ctypes.windll.gdi32

screensize = (user32.GetSystemMetrics(0), user32.GetSystemMetrics(1))
print "screensize =%s"%(str(screensize))
dc = user32.GetDC(None);

screensize = (gdi32.GetDeviceCaps(dc,8), gdi32.GetDeviceCaps(dc,10), gdi32.GetDeviceCaps(dc,12))
print "screensize =%s"%(str(screensize))
screensize = (gdi32.GetDeviceCaps(dc,118), gdi32.GetDeviceCaps(dc,117), gdi32.GetDeviceCaps(dc,12))
print "screensize =%s"%(str(screensize))

매개 변수 gdi32:

#/// Vertical height of entire desktop in pixels
#DESKTOPVERTRES = 117,
#/// Horizontal width of entire desktop in pixels
#DESKTOPHORZRES = 118,
#/// Horizontal width in pixels
#HORZRES = 8,
#/// Vertical height in pixels
#VERTRES = 10,
#/// Number of bits per pixel
#BITSPIXEL = 12,

다음을 사용하는 다른 버전xrandr:

import re
from subprocess import run, PIPE

output = run(['xrandr'], stdout=PIPE).stdout.decode()
result = re.search(r'current (\d+) x (\d+)', output)
width, height = map(int, result.groups()) if result else (800, 600)

파이마우스를 사용할 수 있습니다.화면 크기를 가져오려면 다음을 사용합니다.screen_size()속성:

from pymouse import PyMouse
m = PyMouse()
a = m.screen_size()

a튜플을 돌려줄 겁니다(X, Y),어디에X수평 위치입니다.Y수직 위치입니다.

설명서의 기능에 대한 링크입니다.

이후 버전의 PyGtk의 경우:

import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk

display = Gdk.Display.get_default()
n_monitors = display.get_n_monitors()
print("there are %d monitors" % n_monitors)
for m in range(n_monitors):
  monitor = display.get_monitor(m)
  geometry = monitor.get_geometry()
  print("monitor %d: %d x %d" % (m, geometry.width, geometry.height))

리눅스의 경우 다음을 사용할 수 있습니다.

import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk

s = Gdk.Screen.get_default()
screen_width = s.get_width()
screen_height = s.get_height()
print(screen_width)
print(screen_height)

Linux에서는 하위 프로세스 모듈을 사용할 수 있습니다.

import subprocess
cmd = ['xrandr']
cmd2 = ['grep', '*']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2, stdin=p.stdout, stdout=subprocess.PIPE)
p.stdout.close()

resolution_string, junk = p2.communicate()
resolution = resolution_string.split()[0]
resolution = resolution.decode("utf-8") 
width = int(resolution.split("x")[0].strip())
heigth = int(resolution.split("x")[1].strip())

망막 화면에는 약간 문제가 있습니다. 가짜 크기를 얻기 위해 tkinter를 사용하고 실제 크기를 얻기 위해 필로우 그립을 사용합니다.

import tkinter
root = tkinter.Tk()
resolution_width = root.winfo_screenwidth()
resolution_height = root.winfo_screenheight()
image = ImageGrab.grab()
real_width, real_height = image.width, image.height
ratio_width = real_width / resolution_width
ratio_height = real_height/ resolution_height

언급URL : https://stackoverflow.com/questions/3129322/how-do-i-get-monitor-resolution-in-python

반응형