파이썬에서 모니터 해상도를 얻으려면 어떻게 해야 합니까?
모니터 해상도를 얻는 가장 간단한 방법은 무엇입니까(최적은 튜플)?
다음과 같은 이유로 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)
그러나 창을 화면 크기로 설정하려는 경우 다음 작업을 수행할 수 있습니다.
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
'programing' 카테고리의 다른 글
중복된 행 제거 (0) | 2023.06.18 |
---|---|
Ruby에서 파일을 만드는 방법 (0) | 2023.06.18 |
여러 열을 함께 붙여넣기 (0) | 2023.06.18 |
스토어 게터를 기준으로 조건부로 b-테이블 열 표시/숨기기 (0) | 2023.06.18 |
Excel에서 대문자 분할 (0) | 2023.06.18 |