dumi
|
Posted: Tue Jan 23, 2024 00:55 Post subject: Помогите оживить кнопку со скриптом на Питоне |
|
|
Попросил ИИ написать скрипт для кнопки для Тотала и он мне его написал (честно говоря, изумил! ...). Он предложил Питон, а я не возражал, так как равно ни языков подходящих, ни глубин устройства Тотала не знаю, и разбираться особо не хочу - я не программист. Но заказанная функция, между тем, меня действительно очень и очень интересует.
Сценарий вкратце: 1) В текущей директории найти и запомнить выделенные файлы со значениями их атрибутов дат (съемки, создания и модернизации); 2) Открыть штатную форму "Свойства"; 3) После закрытия формы "Свойства" (по нажатию пользователем ОК), по списку в памяти восстановить значения дат в файлах.
Сыр-бор из-за того, что после сохранения редактирования тегов в форме "Свойства", значение даты модернизации меняется на текущую, что категорически неприемлемо (теги можно менять оптом сразу в большом количестве файлов).
Я не программист, но для себя бывало кое-что кое-в-чем программировал. Поэтому скрипт по смыслу показался мне в общем понятным, и с точки зрения бизнес-логики правильным. Но ... не работает ; При нажатии кнопки в Тотале, что-то черное мигает (вероятно, это окно самого Питона), и больше ничего не происходит. Не мог бы кто-н глянуть? Может даже не сильно много нужно подправить, чтобы заработало? чем черт (ИИ) не шутит ...
Версия Тотала - 9.21а (вряд ли важно, но ...)
Код который написал ИИ:
Code: | # Импортируем модули
import os
import datetime
import subprocess
from PIL import Image
from PIL.ExifTags import TAGS
# Создаем таблицу соответствия
table = {}
# Получаем список выделенных файлов фотографий в текущей директории
files = os.listdir(".")
selected_files = [f for f in files if f.endswith(".jpg") or f.endswith(".png")]
# Перебираем все выделенные файлы
for file in selected_files:
# Открываем файл как изображение
image = Image.open(file)
# Получаем словарь с метаданными EXIF
exif = image.getexif()
# Извлекаем дату съемки, если есть
date_taken = exif.get(36867, None)
#------------ эти строчки я уже сам вставил, думал может хоть застрянет на этом, но ни фига ...
# print("Дата съемки - ", date_taken)
#-----------------------------
# Получаем дату создания и редактирования файла
date_created = datetime.datetime.fromtimestamp(os.path.getctime(file))
date_modified = datetime.datetime.fromtimestamp(os.path.getmtime(file))
# Сохраняем имена и даты в таблице
table[file] = (date_taken, date_created, date_modified)
# Открываем форму "Свойства" Total Commander
# Для этого используем команду wcmicons.exe с параметром 100
# Эта команда должна быть в папке с Total Commander
# Если нет, то нужно указать полный путь к ней
subprocess.run(["wcmicons.exe", "100"])
# После закрытия формы, перебираем все записанные в таблице файлы
for file in table:
# Получаем даты из таблицы
date_taken, date_created, date_modified = table[file]
# Если дата съемки есть, то устанавливаем ее в метаданные EXIF
if date_taken:
image = Image.open(file)
exif = image.getexif()
exif[36867] = date_taken
image.save(file, exif=exif)
# Устанавливаем дату создания и редактирования файла
os.utime(file, (date_created.timestamp(), date_modified.timestamp())) |
Добавлено спустя 24 минуты:
dumi wrote: | # Открываем форму "Свойства" Total Commander
# Для этого используем команду wcmicons.exe с параметром 100
# Эта команда должна быть в папке с Total Commander
# Если нет, то нужно указать полный путь к ней
subprocess.run(["wcmicons.exe", "100"]) |
Блин, только отправил пост, осенило проверить наличие этого файла. Так его нет Есть только "wcmicons.dll" ... Попробовал заменить в коде на "dll", но как и следовало ожидать, не работает. И что же делать? Как открыть форму "Свойства"?
Добавлено спустя 1 час 19 минут:
Объяснил ИИ ситуацию и попросил переписать этот фрагмент кода под мою версию ТС. И он переписал:
Code: | # Открываем форму "Свойства" Total Commander
# Для этого используем команду rundll32.exe с параметрами wcmicons.dll и 100
# Эта команда должна быть в папке с Total Commander
# Если нет, то нужно указать полный путь к ней
subprocess.run(["rundll32.exe", "wcmicons.dll,100"]) |
Но все равно, не работает, визуально ничего не изменилось
Last edited by dumi on Fri Feb 02, 2024 13:25; edited 1 time in total |
|