2016-07-22 1 views
0

code:Python - ne peut pas définir le papier peint avec tempfile

import urllib.request 
import tempfile 
import shutil 
import ctypes 

SPI_SETDESKWALLPAPER = 20 
with urllib.request.urlopen('https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png') as response, tempfile.NamedTemporaryFile() as f: 
    shutil.copyfileobj(response, f) 
    ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, f.name, 0) 

Cependant, si vous utilisez tempfile.NamedTemporaryFile(delete=False) cela fonctionne.

L'état docs:

Si suppression est true (par défaut), le fichier est supprimé dès qu'il est fermé.

Dans mon code d'origine, le fichier n'est pas supprimé avant d'avoir quitté le corps de l'instruction with lorsqu'il est automatiquement fermé. Alors pourquoi n'est pas SPI_SETDESKWALLPAPER de travail?

Répondre

0

Je compris le problème:

Pour commencer, la valeur du paramètre fWinIni doit être changé:

SPIF_UPDATEINIFILE = 0x01 
SPIF_SENDCHANGE = 0x02 
ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, f.name, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE) 

Cela préserve le fond d'écran après la fermeture de session.

En second lieu, le fichier temporaire doit être fermé pour que SystemParametersInfoW pour travailler. Par conséquent, delete=False est nécessaire.

Enfin, supprimez le fichier temporaire manuellement à l'aide os.remove(f.name).

0

Vous devez lire les phrases suivantes de couple dans la documentation, qui se lisait quelque chose comme ceci:

Sous Unix, l'entrée du répertoire du fichier est soit pas créé tout ou est retiré immédiatement après la le fichier est créé. Les autres plates-formes ne prennent pas cela en charge. votre code ne doit pas s'appuyer sur un fichier temporaire créé en utilisant cette fonction ayant ou non un nom visible dans le système de fichiers.