使用具有跨平台支持的python调整显示分辨率的大小
使用python函数调整显示分辨率的大小。它应该是跨平台的,即支持Windows,Linux和Mac(根据操作系统的不同,可以有多种情况)
我有我认为可以在linux(Ubuntu)上运行的代码,我正在寻找Windows和Mac的解决方案(应同时支持32位和64位计算机)
def SetResolution(width, height):
os.popen("xrandr -s "+str(width)+'x'+str(height))
如果有人能告诉我如何获得Windows和Mac的可能的显示分辨率,我也将不胜感激
我在linux上的功能是这样的:
def GetResolutions():
screen = os.popen("xrandr").readlines()
possibleResolutions = []
for a in screen:
data = a.split()
if len(data)<4:
width, height = data[0].split('x')
fps = re.sub("[^0-9.]", "", data[1])
possibleResolutions.append({'width':int(width),'height':int(height),'fps':float(fps)})
if '*' in data[1]:
currentResolution = {'width':int(width),'height':int(height),'fps':float(fps)}
return possibleResolutions, currentResolution
-
以下是在Windows上运行的解决方案(取决于pywin32)。有些占位符可用于放置现有的Linux代码,但是我不确定如何处理OSX。
from __future__ import print_function import sys class ScreenRes(object): @classmethod def set(cls, width=None, height=None, depth=32): ''' Set the primary display to the specified mode ''' if width and height: print('Setting resolution to {}x{}'.format(width, height, depth)) else: print('Setting resolution to defaults') if sys.platform == 'win32': cls._win32_set(width, height, depth) elif sys.platform.startswith('linux'): cls._linux_set(width, height, depth) elif sys.platform.startswith('darwin'): cls._osx_set(width, height, depth) @classmethod def get(cls): if sys.platform == 'win32': return cls._win32_get() elif sys.platform.startswith('linux'): return cls._linux_get() elif sys.platform.startswith('darwin'): return cls._osx_get() @classmethod def get_modes(cls): if sys.platform == 'win32': return cls._win32_get_modes() elif sys.platform.startswith('linux'): return cls._linux_get_modes() elif sys.platform.startswith('darwin'): return cls._osx_get_modes() @staticmethod def _win32_get_modes(): ''' Get the primary windows display width and height ''' import win32api from pywintypes import DEVMODEType, error modes = [] i = 0 try: while True: mode = win32api.EnumDisplaySettings(None, i) modes.append(( int(mode.PelsWidth), int(mode.PelsHeight), int(mode.BitsPerPel), )) i += 1 except error: pass return modes @staticmethod def _win32_get(): ''' Get the primary windows display width and height ''' import ctypes user32 = ctypes.windll.user32 screensize = ( user32.GetSystemMetrics(0), user32.GetSystemMetrics(1), ) return screensize @staticmethod def _win32_set(width=None, height=None, depth=32): ''' Set the primary windows display to the specified mode ''' # Gave up on ctypes, the struct is really complicated #user32.ChangeDisplaySettingsW(None, 0) import win32api from pywintypes import DEVMODEType if width and height: if not depth: depth = 32 mode = win32api.EnumDisplaySettings() mode.PelsWidth = width mode.PelsHeight = height mode.BitsPerPel = depth win32api.ChangeDisplaySettings(mode, 0) else: win32api.ChangeDisplaySettings(None, 0) @staticmethod def _win32_set_default(): ''' Reset the primary windows display to the default mode ''' # Interesting since it doesn't depend on pywin32 import ctypes user32 = ctypes.windll.user32 # set screen size user32.ChangeDisplaySettingsW(None, 0) @staticmethod def _linux_set(width=None, height=None, depth=32): raise NotImplementedError() @staticmethod def _linux_get(): raise NotImplementedError() @staticmethod def _linux_get_modes(): raise NotImplementedError() @staticmethod def _osx_set(width=None, height=None, depth=32): raise NotImplementedError() @staticmethod def _osx_get(): raise NotImplementedError() @staticmethod def _osx_get_modes(): raise NotImplementedError() if __name__ == '__main__': print('Primary screen resolution: {}x{}'.format( *ScreenRes.get() )) print(ScreenRes.get_modes()) #ScreenRes.set(1920, 1080) #ScreenRes.set() # Set defaults