如何在Python中获得显示器分辨率?
获取显示器分辨率的最简单方法是什么(最好是在一个元组中)?
在Windows上:
from win32api import GetSystemMetrics print "Width =", GetSystemMetrics(0) print "Height =", GetSystemMetrics(1)
基于此
http://bytes.com/topic/python/answers/618587-screen-size-resolution-win32-python
在Windows中,您也可以使用ctypes:
import ctypes user32 = ctypes.windll.user32 screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
这样你就不需要安装pywin32包了; 它不需要Python本身没有的东西。
如果你使用wxWindows,你可以简单地做:
import wx app = wx.App(False) # the wx.App object must be created first. print(wx.GetDisplaySize()) # returns a tuple
仅供参考,我为此创build了一个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,但拉请求是完全受欢迎的。
直接从这篇文章的答案: 如何获得在Tkinter的屏幕大小?
import tkinter as tk root = tk.Tk() screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight()
为了完整起见,Mac OS X
import AppKit [(screen.frame().size.width, screen.frame().size.height) for screen in AppKit.NSScreen.screens()]
会给你一个包含所有屏幕尺寸的元组列表(如果有多个显示器)
在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默认是一个“system dpi aware”应用程序。 DPI感知应用程序的types在这里列出: 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)
根据此窗口网站: http : //msdn.microsoft.com/en-us/library/aa770067%28v=vs.85%29.aspx报告的系统有效分辨率的公式是:(报告的_px * current_dpi)/(96 dpi )=物理_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的能力的显示器。 我的显示缩放将我目前的DPI设置为158。
我将使用158来确保我的matplotlib图是正确的大小:从pylab import rcParams rcParams ['figure.dpi'] = curr_dpi
这里是一个快速的小Python程序,它将显示关于多显示器设置的信息:
import gtk window = gtk.Window() # the screen contains all monitors screen = window.get_screen() print "screen size: %dx %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: %dx %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: %dx %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)
如果您使用的是特定的PySide
Qt
工具包,您可以执行以下操作:
from PySide import QtGui import sys app = QtGui.QApplication(sys.argv) screen_rect = app.desktop().screenGeometry() width, height = screen_rect.width(), screen_rect.height()
使用Linux,最简单的方法是执行bash命令
xrandr | grep '*'
并使用regexpparsing其输出。
你也可以通过PyGame: http ://www.daniweb.com/forums/thread54881.html
我在我的一个项目中使用了一个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)
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)
试试下面的代码:
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
老问题,但这是缺less的。 我是python新手,所以请告诉我这是否是一个“坏”的解决scheme。 这个解决scheme仅支持windows和mac,它只适用于主屏幕,但是在问题中没有提到os。
通过截图测量大小。 由于屏幕尺寸不应该改变,所以只能做一次。 有更多优雅的解决scheme,如果你有一个像gtk,wx,…安装的GUI工具包。
见枕头
pip install Pillow
from PIL import ImageGrab img = ImageGrab.grab print (img.size)
试试下面的代码:
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))
使用Linux而不是正则expression式采取第一行,并拿出当前的分辨率值。
当前显示分辨率: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 %sx %s" % (width,height) Current resolution is 1920 x 1080
这是在xrandr 1.3.5上完成的,我不知道其他版本的输出是否有所不同,但这应该很容易理解。
要获得每像素的位数:
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,
试试pyautogui:
import pyautogui resolution = pyautogui.size() print(resolution)
另一个版本使用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)
使用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]