tl; dr Обычный способ использования python для установки фона рабочего стола с помощью ctypes слишком медленный для целей анимации. Мне интересно, есть ли у меня какие-либо варианты установки фона на O (5 кадров в секунду), не снижая производительности моего компьютера.
~~~~
Привет, ребята!
На днях меня воодушевила эта идея: я хотел, чтобы фон моего рабочего стола проходил через самые последние изображения Солнца (из SDO), загруженные с веб-сайта НАСА. И это сработало! У меня есть код, который работает в фоновом режиме на моем компьютере и обновляет мой рабочий стол каждые тридцать секунд до новейшего изображения из Интернета (он также циклически переключает длины волн. Очень весело!) И это действительно круто! Смотреть на него каждый день и видеть, как меняется солнце, - это круто. Так что это успех.
Но у Солнца также есть много краткосрочной динамики, которую я тоже хотел бы наблюдать! Итак, подумал я, решение достаточно простое! Просто сохраните последние 30 загруженных изображений и быстро раздайте их! Петля достаточно простая (перегонка до базовых компонентов):
import os
import ctypes
import time
#Get the filepaths of all pictures in a folder
folderPath = fromGod()
items = os.listdir(folderPath)
listOfFiles = [folderPath + item for item in items]
frameTime = 0.25 #second
runFor = 30 #seconds
#Cycle through the pictures
startTime = time.time()
while time.time() - startTime < runFor:
for file in listOfFiles:
ctypes.windll.user32.SystemParametersInfoW(20, 0, file , 0)
time.sleep(frameTime)
Это действительно работает! Выглядит неплохо, и я бы даже согласился на 4 кадра в секунду, на которые он, кажется, способен, прежде чем он вообще перестанет работать. Проблема в том, что каждый вызов функции ctypes заставляет всю систему {зависать ?. заикаться ?, тормозить?}. Это полностью убивает идею, потому что я не могу позволить этому коду работать в фоновом режиме. Из-за этого моя мышь заикается по экрану.
Но я вижу, что существуют программы, которые могут превратить фон рабочего стола в фильм, поэтому я надеюсь, что есть другой способ сделать это самостоятельно на Python. Думаю, я просто не понимаю, почему эта функция должна иметь такую утечку в системе. Но поиск здесь при переполнении стека и в Google не дал результатов с точки зрения альтернативных способов сделать это.
Я нахожусь на ноутбуке Dell с Windows 10, на котором запущен python 3.6.5 в форме Anaconda.
Изначально я использовал 2048x2048, но я просто попробовал 1024 и 512, и это не повлияло на это.
Для начала пробовали ли вы написать приведенный выше код в C, чтобы узнать, действительно ли проблема в Python? (в чем я как бы сомневаюсь). Что в вашей программе занимает так много времени? Помните, что вам не следует использовать time.sleep(frameTime)
, но вы должны вычесть время, необходимое для завершения SystemParametersInfoW
. На самом деле вам даже не нужен шлейф for
. О каком количестве файлов идет речь (в folderPath
)? Кстати вы используете компьютер, чтобы смотреть на рабочий стол? Не имеет смысла установить приложение, которое будет циклически переключать изображения только тогда, когда вы хотите их просматривать? У Победить нет опции слайд-шоу?
У меня есть несколько мониторов, и один из них часто достаточно четкий, так что на нем интересно наблюдать за солнцем вживую. Обычно я думаю не более 10-30 файлов.
Какого размера каждое изображение, которое вы загружаете и готовите для установки в качестве обоев? попробуйте уменьшить размер изображения и разрешение и протестируйте код.