Как закрыть файл (фотографию), если я открыл его с помощью команды os.startfile в Python?

Здравствуйте! Я только начинаю изучать эту сферу, и буду признателен за вашу помощь. Подскажите, пожалуйста, как мне сделать так, чтобы случайно открытая картинка из другой директории (с помощью приложения "Фотографии" Windows) закрывалась через определённое время после выполнения следующего кода, а затем цикл начинался заново? Я не смог придумать решение самостоятельно: <br/> <pre><code class="python">from tkinter import *
from tkinter import ttk
import random
import time
import os

def btn_photo(): 
''' Эта функция идёт у меня под кнопку в Tk, + фото 
имеют один формат и строгую нумерацию '''
	while True:
		numP = random.randint(0, 50)
		fp = os.startfile(fr'E:\Разное\Картинки\Фото ({numP}).jpg')
		time.sleep(5)
		#тут я и остановился...</code></pre>
  • 9 декабря 2024 г. 2:23
Ответы на вопрос 2
Для того чтобы закрыть файл (фотографию), открытый с помощью команды `os.startfile`, вам нужно воспользоваться дополнительными инструментами, поскольку `os.startfile` открывает файл с помощью приложения по умолчанию (в вашем случае это "Фотографии" Windows) и не предоставляет возможности закрывать их напрямую.

Один из способов закрыть приложение "Фотографии" - это использовать модуль `subprocess` для запуска команды, которая завершит процесс.

Вот пример, как это можно сделать:

```python
from tkinter import *
from tkinter import ttk
import random
import time
import os
import subprocess

def btn_photo():
    while True:
        numP = random.randint(0, 50)
        photo_path = fr'E:\Разное\Картинки\Фото ({numP}).jpg'
        os.startfile(photo_path)
        time.sleep(5)  # Даем время открытой фотографии

        # Закрываем приложение "Фотографии"
        # Находим все процессы "Photos" (или другое название, в зависимости от вашего локализованного приложения)
        # При необходимости измените "Photos" на соответствующее имя процесса
        subprocess.call(["taskkill", "/F", "/IM", "Photos.exe"]) 

        # Здесь можно использовать time.sleep, если вы хотите паузу между показами фотографий
        time.sleep(1)

# Эта функция нужно, чтобы создать интерфейс с кнопкой
def create_interface():
    root = Tk()
    root.title("Photo Viewer")

    btn = ttk.Button(root, text="Show Random Photo", command=btn_photo)
    btn.pack(pady=20)

    root.mainloop()

if __name__ == "__main__":
    create_interface()
```

### Пояснения:
1. **os.startfile(photo_path)** – открывает изображение с помощью приложения, установленного по умолчанию для данного типа файлов.
2. **subprocess.call(["taskkill", "/F", "/IM", "Photos.exe"])** – эта команда завершает процесс "Photos". Если у вас другое приложение, вы можете заменить "Photos.exe" на имя соответствующего исполняемого файла.
3. **Таймауты** – вы можете изменять значения `time.sleep`, чтобы задать, сколько времени фотография будет открыта до её закрытия.

### Важно:
- Использование метода `taskkill` будет закрывать все экземпляры указанного приложения. Если у вас открыто еще какое-то изображение в "Фотографиях", оно тоже будет закрыто. Это нужно учитывать при использовании данного метода.
Закрывайте приложение, которое открывает файл, как вариант: 
os.system('taskkill /IM Honeyview.exe') # <= поменяйте на ту программу что у вас ассоциирована с jpg.


З.Ы. os.startfile() возвращает None, нет смысла присваивать переменной.
Похожие вопросы