Python - 无法使用tempfile设置壁纸

时间:2016-07-22 17:31:13

标签: python python-3.5

代码:

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),则可以使用。

文档声明:

  

如果delete为true(默认值),则会立即删除该文件   闭合。

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

2 个答案:

答案 0 :(得分:0)

您需要阅读文档中的下几个句子,其内容如下:

  

在Unix下,文件的目录条目根本没有创建或   在创建文件后立即删除。其他平台则没有   支持这个;您的代码不应该依赖于使用创建的临时文件   此函数在文件系统中具有或不具有可见名称。

答案 1 :(得分: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)手动删除临时文件。