2016-07-22 35 views
0

代码:Python的 - 不能设置墙纸临时文件

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) 

但是,如果你使用tempfile.NamedTemporaryFile(delete=False)它的作品。

的文档状态:

如果删除为真(默认),该文件是只要它是封闭 删除。

在我的原始代码中,文件在自动关闭后退出with语句的主体后才会被删除。那么为什么不是SPI_SETDESKWALLPAPER工作?

回答

0

我想通了这个问题:

首先,需要改变的fWinIni参数的值:

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

这保留注销后的壁纸。

其次,需要关闭临时文件才能使SystemParametersInfoW正常工作。因此,delete=False是必要的。

最后,使用os.remove(f.name)手动删除临时文件。

0

你需要阅读的文件,上面写着这样的事情在接下来的两句话:

在Unix下,该文件的目录项要么根本不产生或 是后立即删除文件已创建。其他平台不支持此功能, 支持此;您的代码不应该依赖使用 此功能在文件系统中具有或不具有可见名称创建的临时文件。