Redimensionner la résolution d'affichage en utilisant python avec le support de la plateforme cross

redimensionner la résolution d'affichage en utilisant une fonction python. Il devrait être multiplate-forme, c'est à dire support pour windows, linux et mac (il est normal d'avoir plusieurs cas selon le système d'exploitation)

j'ai du code qui, je pense, fonctionne sur linux (Ubuntu) je cherche une solution pour windows et mac (devrait prendre en charge les machines 32 et 64 bits)

def SetResolution(width, height):
    os.popen("xrandr -s "+str(width)+'x'+str(height))

j'apprécierais aussi que quelqu'un me dise comment je pourrais obtenir les résolutions d'affichage possibles pour windows et mac

ma fonction sur linux est ceci:

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
12
demandé sur sj7 2013-12-30 15:03:20

3 réponses

ci-Dessous est une solution qui fonctionne sur Windows (dépend de pywin32). Il y a des espaces réservés où vous pouvez placer votre code linux existant, mais je ne suis pas sûr de savoir quoi faire à propos D'OS X.

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
6
répondu dwurf 2014-01-08 13:23:30

Beaucoup de réponses sont déjà dispersés autour de StackOverflow et peuvent être résumées comme suit.

Pour obtenir la résolution sur Windows dans un but purement pythonic de la mode (référence: https://stackoverflow.com/a/3129524/2942522):

import ctypes
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

la solution MacOS utilise aussi Python, mais utilise un paquet en dehors de la bibliothèque standard (référence:https://stackoverflow.com/a/3129567/2942522):

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

apparemment le compréhension de liste va itérer sur les écrans dans une configuration de plusieurs moniteurs.

je pense que Alex Martelli la réponse à une question connexe (https://stackoverflow.com/a/2662892/2942522) est également remarquable. Il utilise:

pygame.display.list_modes()
[(1920, 1080), (1768, 992), (1680, 1050), (1600, 1200), (1600, 1024), (1600, 900
), (1440, 900), (1400, 1050), (1360, 768), (1280, 1024), (1280, 960), (1280, 800
), (1280, 768), (1280, 720), (1152, 864), (1024, 768), (800, 600), (720, 576), (
720, 480), (640, 480)]

pour obtenir une liste des plus grandes à plus petites résolutions disponibles (bien que pygame deviendrait une dépendance si vous empruntiez cette route). À l'inverse, je pense que cela fonctionnerait très bien dans un environnement multiplateforme. En outre, il mentionne pygame.display.set_mode pour la mise en place de la résolution (docs:http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode). Voici un extrait des docs pour set_mode:

" l'argument de résolution est une paire de nombres représentant la largeur et la hauteur. L'argument flags est une collection d'options supplémentaires. L'argument depth représente le nombre de bits à utiliser pour la couleur."

peut-être que cela vous aidera à commencer. Au moins, vous pourriez peut-être vérifier le code source set_mode pour voir s'il y a une inspiration possible si vous ne pouvez pas l'utiliser directement.

autres idées potentiellement utiles:

  1. vous pouvez faire une vérification de plate-forme brute avec sys.platform (docs: http://docs.python.org/2/library/sys.html#sys.platform). Cela renvoie 'darwin' sur MacOS.
  2. l'architecture bit doit être accessible avec le Python platform module. Si je run platform.architecture() sur ma machine il retourne un tuple: ('64bit', '') (docs:http://docs.python.org/2/library/platform.html#platform.architecture)
7
répondu treddy 2017-05-23 11:51:34

pour obtenir et mettre la résolution sous Windows (à la fois 32 et 64 bits), vous pouvez utiliser les ctypes et l'user32 dll (ctypes.windll.user32). Ne vous souciez pas du '32' au nom de la dll - c'est une dll 64 bits sur les fenêtres 64 bits. Cette bibliothèque vous permet également de découvrir les résolutions autorisées.

Vous pouvez aussi utiliser un outil en ligne de commande comme nircmd.exe:

nircmd.exe 1024 768 32

le dernier numéro est la profondeur de couleur.

Espérons que cette aider.

1
répondu Andrei Boyanov 2014-01-05 16:57:49