I have a script that changes the Windows background image considering the current time of the day (day or night). I wanted to make this script scalable in order to be used on another computer without any change in the code.
from datetime import datetime, time
import pandas
import ctypes
from pathlib import Path
file_path = "myfile.xlsx" #sunrise/sunset file path
print(file_path)
data = pandas.read_excel(file_path, header=0) #Header on line 0
#Today as day number in reference to 1st of Jan
day = datetime.now().timetuple().tm_yday
#Today's parameters
#sr and ss are column names in the Excel spreadsheet for sunrise and sunset respectively
#Minus 1 to account for 0 based indexing
sunrise = data["sr"][day - 1]
sunset = data["ss"][day - 1]
#Function to convert time objects into integers
def seconds_in_time(time_value: time):
return (time_value.hour * 60 + time_value.minute) * 60 + time_value.second
notification_minutes = 5
notification_seconds = notification_minutes * 60
#Variable for a moment in time 5 minutes before the sunset
sunset_minus_five = seconds_in_time(sunset) - notification_seconds
#Setting up the day_night variable depending on the now variable
#delta calculates the difference in seconds between now and sunset -during night- and sunrise -during day-
#A negative value for delta means that now variable is equal to any moment between midnight and the sunrise
if now > sunrise and now < sunset:
day_night = 'day'
delta = (seconds_in_time(now) - seconds_in_time(sunrise))
else:
day_night = 'night'
delta = (seconds_in_time(now) - seconds_in_time(sunset))
#delta_notification calculates the difference in seconds between now and sunset_minus_five
delta_notification = seconds_in_time(now) - sunset_minus_five
abs_path = Path().resolve()
print(abs_path)
sep = '\\'
target_path = abs_path + sep + day_night + '.jpg'
print(target_path)
#Function to change the wallpaper
def changeBG(target_path):
ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) #SystemParametersInfoW for x64 architecture
#Wallpaper when code is ran user log on
#changeBG(target_path)
This code returns me the following error:
TypeError Traceback (most recent call last)
<ipython-input-11-ca377c654d5c> in <module>
42 print(abs_path)
43 sep = '\\'
---> 44 target_path = abs_path + sep + day_night + '.jpg'
45 print(target_path)
46
TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str'
Before coming to this pathlib
approach I have tried a static approach with:
path = 'C:\\Users\\myuser\\Desktop\\Sunset\\wallpapers_desktop_only\\'+ day_night +'\\'+ vmc_imc_day_night() +'.jpg'
#Function to change the wallpaper
def changeBG(path):
ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) #SystemParametersInfoW for x64 architecture
This has worked without any problems since the separator that ctypes
is expecting is \\
, but pathlib
returns me \
which cannot be used as a string.
How can I use pathlib
in order to use any files/directories that are inside my working directory?
pathlib
doesn't work the way you are using it.
When using pathlib is saves you from adding the separators yourself, and you can concatenate paths by using the /
operator (which is overridden in the package)
You should try:
target_path = abs_path / f'{day_night}.jpg'