Creating a background changer in python with ctypes, not working

前端 未结 3 1180
野趣味
野趣味 2020-12-06 23:52

I\'m working on a simple (I thought) program to set a different desktop background for every day of the week. It runs with no errors but nothing happens. The path to the ima

相关标签:
3条回答
  • 2020-12-07 00:26

    This is not an answer to your question, but you can generally minify your program and remove redundancy by doing something like this instead:

    import time;
    import ctypes;
    SPI_SETDESKWALLPAPER = 20
    
    wallpapers = [
        r"C:\Users\Owner\Documents\Wallpaper\1.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\2.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\3.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\4.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\5.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\6.jpg",
        r"C:\Users\Owner\Documents\Wallpaper\7.jpg",
    ]
    
    localtime = time.localtime(time.time())
    wkd = localtime[6]
    ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, wallpapers[wkd], 0)
    
    0 讨论(0)
  • 2020-12-07 00:41

    I must have read every existing site on this topic and just before giving up, came to this working code (win7 pro 64 bit, python 3.4)

    import ctypes
    SPI_SETDESKWALLPAPER = 0x14     #which command (20)
    
    SPIF_UPDATEINIFILE   = 0x2 #forces instant update
    src = r"D:\Downloads\_wallpapers\3D-graphics_Line_025147_.jpg" #full file location
    #in python 3.4 you have to add 'r' before "path\img.jpg"
    
    print(ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, src, SPIF_UPDATEINIFILE))
    

    It uses SystemParametersInfoW instead of SystemParametersInfoA (W instead of A).

    Hope it helps you and many others who seem to have similar problems.

    0 讨论(0)
  • 2020-12-07 00:42

    If you are using Python 3 you should use ctypes.windll.user32.SystemParametersInfoW instead of ctypes.windll.user32.SystemParametersInfoA(W instead of A as this answer said). Another answer described that because in Python 3 the str type is in form of UTF-16 as wchar_t * in C.

    What's more, please minimize the code like this:

    import time;
    import ctypes;
    SPI_SETDESKWALLPAPER = 20
    
    wallpapers = r"C:\Users\Owner\Documents\Wallpaper\%d.jpg"
    
    localtime = time.localtime(time.time())
    wkd = localtime[6]
    ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, wallpapers%(wkd+1), 0)
    

    Don't Repeat Yourself.

    0 讨论(0)
提交回复
热议问题