使用具有跨平台支持的python调整显示分辨率的大小

发布于 2021-01-29 18:08:29

使用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
关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    以下是在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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看