代码:
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
工作?
答案 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)
手动删除临时文件。