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
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
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:
- 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. - l'architecture bit doit être accessible avec le Python
platform
module. Si je runplatform.architecture()
sur ma machine il retourne un tuple:('64bit', '')
(docs:http://docs.python.org/2/library/platform.html#platform.architecture)
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.