web-dev-qa-db-ja.com

Pythonでモニターの解像度を取得するにはどうすればよいですか?

(できればタプルで)モニター解像度を取得する最も簡単な方法は何ですか?

88
rectangletangle

Windowsの場合:

from win32api import GetSystemMetrics

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

高解像度画面で作業している場合は、pythonインタープリターがHIGHDPIAWAREであることを確認してください。

this postに基づきます。

55
Robus

Windowsでは、 GetSystemMetrics() でctypesを使用することもできます。

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)
99
jcao219

この理由で 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をサポートしていますが、プルリクエストは大歓迎です。

66
rr-

WxWindowsを使用している場合は、次の操作を実行できます。

import wx

app = wx.App(False) # the wx.App object must be created first.    
print(wx.GetDisplaySize())  # returns a Tuple
42
Ned Batchelder

この投稿への回答から直接取得: Tkinterで画面サイズを取得する方法?

import tkinter as tk

root = tk.Tk()

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

Windows 8.1では、ctypesまたはtkから正しい解像度が得られません。他の人がctypesに対して同じ問題を抱えています: getsystemmetricsが間違った画面サイズを返します Windows 8.1で高DPIモニターの正しいフル解像度を取得するには、 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 報告されるシステムの有効解像度の式は次のとおりです。(reported_px * current_dpi)/(96 dpi)= physical_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

220 DPI対応モニターでWindows 8.1を実行しています。ディスプレイのスケーリングにより、現在のDPIが158に設定されます。

158を使用して、matplotlibプロットが正しいサイズであることを確認します:from pylab import rcParams rcParams ['figure.dpi'] = curr_dpi

21
spacether

完全を期すために、Mac OS X

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

すべての画面サイズを含むタプルのリストが表示されます(複数のモニターが存在する場合)

15
cobbal

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

Linuxを使用する最も簡単な方法は、bashコマンドを実行することです

xrandr | grep '*'

そして、正規表現を使用して出力を解析します。

また、あなたはPyGameを通してそれを行うことができます: http://www.daniweb.com/forums/thread54881.html

12
Pavel Strakhov

以下に、マルチモニター設定に関する情報を表示する小さな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
starfry

私は、以下のようなプロジェクトの1つで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)
8
Martin Hansen

古い質問ですが、これはありません。私はpythonが初めてなので、これが「悪い」解決策かどうか教えてください。このソリューションはWindowsとMacOSでのみサポートされており、メイン画面でのみ機能しますが、OSは質問に記載されていません。

スクリーンショットを撮ってサイズを測定します。画面サイズは変更すべきではないので、これは一度だけ行う必要があります。 GTK、wxなどのGUIツールキットがインストールされている場合、よりエレガントなソリューションがあります。

を参照

pip install Pillow

from PIL import ImageGrab

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

XWindowsバージョン:

#!/usr/bin/python

import Xlib
import Xlib.display

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

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

次のコードを試してください:

import subprocess
resuls = subprocess.Popen(['xrandr'],stdout=subprocess.PIPE).communicate()[0].split("current")[1].split(",")[0]
width = resuls.split("x")[0].strip()
heigth = resuls.split("x")[1].strip()
print width + "x" + heigth
5
Taghouti Tarek

正規表現の代わりに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で行われ、他のバージョンで出力が異なるかどうかはわかりませんが、これにより簡単に理解できるはずです。

3
Alex R

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)
2
sirex

@ user2366975 の答えを展開し、Tkinterを使用してマルチスクリーン設定で現在の画面サイズを取得します(Python 2/3のコード):

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でのみテストされます)

2
norok2

pygame を使用:

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]

2
tburrows13

ピクセルあたりのビット数を取得するには:

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,
2
user3757097

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で動作します

1
Diroallu

Pyautoguiを試してください:

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

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))
0
satyagraha

Retinaスクリーンでは少し面倒です。私は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
0
NicolasLi

PyMouse を使用できます。画面サイズを取得するには、screen_size()属性を使用します。

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

aは、タプル(X, Y)を返します。Xは水平位置、Yは垂直位置です。

ドキュメント内の関数へのリンク。

0
Simon

クロスプラットフォームでこれを行う簡単な方法は、ほとんどすべてのpythonバージョンに付属するTKinterを使用することです。したがって、何もインストールする必要はありません。

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

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())
0
kamran kausar