当前位置: 首页 > 面试题库 >

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

袁耀
2023-03-14
问题内容

使用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


 类似资料:
  • 为了更好的提升微页面在移动端的阅读体验,对于微页面图片上传做了以下限制: 图片大小最大2M 图片分辨率最大1080px; 在遇到设计师给出超大分辨率的高清图片时,可通过 1、在系统文件夹内找到需要调整的图片,右键选择【编辑】,进入画图编辑图片; 2、在画图左上区域找到【重新调整大小】并点击,在弹出窗口【调整大小和扭曲】中选择重新调整大小依据为“像素”,勾选“保持纵横比”,在水平输入框中输入750(

  • 目前 Electron 支持以下平台: macOS macOS系统版本>=10.9 仅提供64位版本的Electron. Windows Windows系统版本>=7 提供 ia32 (x86) 和 amd64 (x64) 版本的Electron. 需要注意的是 ARM 版本的 Windows 目前尚不支持。 Linux Ubuntu系统版本>=12.04,Fedora系统版本>=21,Debia

  • 如果安装了 Linux 的图形界面,则使用图形界面修改分辨非常方便也很简单。但是如果只安装了字符界面,难道就不能修改分辨率了吗? 当然是可以的,只要利用 GRUB 的配置文件就可以完成。当然需要确定内核是否支持 CONFIG_FRAMEBUFFER_CONSOLE 功能,如果没有开启这项功能,则需要重新编译内核。査询方法如下: [root@localhost ~]# grep "CONFIG_FR

  • Appium 支持多种平台以及各种测试方式(native,hybrid,web,真机,模拟器,等等...)。这份文档的设计初衷就是为了搞清楚所支持平台的版本,以及所需的条件。 iOS 平台支持 获取 iOS 平台下所需的必备条件和安装说明,请查阅 XCUITest Driver(English) 版本:9.0 及以上版本 设备:iPhone 模拟器,iPad 模拟器,以及 iPhone 和 iPa

  • 以下的平台是 Electron 目前支持的: OS X 对于 OS X 系统仅有64位的二进制文档,支持的最低版本是 OS X 10.8。 Windows 仅支持 Windows 7 及其以后的版本,之前的版本中是不能工作的。 对于 Windows 提供 x86 和 amd64 (x64) 版本的二进制文件。需要注意的是 ARM 版本的 Windows 目前尚不支持. Linux 预编译的 ia3