Zwei Python-Skripts, mit tkinter und Überwachung auf neu angelegte Dateien, verheiraten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sempervivum
User
Beiträge: 11
Registriert: Montag 22. November 2021, 21:57

Guten Tag liebe Python-Experten,
ich bin noch nicht allzu fit in Python und habe zwei Skripts geschrieben, um ein Verzeichnis auf neue Dateien zu überwachen und diese mit Irfanview anzuzeigen. Wenn ich die Dateien mit Irfanview sichten will, das passiert in einem Controlscript mit tkinter, ohne dass die Überwachung neue Dateien öffnet, muss ich die Überwachung pausieren.
Zzt koordiniere ich das mit einer Hilfsdatei: Soll die Überwachung pausieren, erzeuge ich diese Datei und wenn sie weiter machen soll, lösche ich sie. Funktioniert so weit.

Die Frage ist, ob ich beides in einem Skript zusammen legen kann und beides mit einer Variablen statt einer Hilfsdatei koordinieren. Und zwar auf einfache Weise ohne dass ich mich in Threads o. ä. einarbeiten muss.

Hier die Scripts, zunächst die Überwachung:

Code: Alles auswählen

import sys
import os
import time
import subprocess
from watchdog.events import FileSystemEvent, FileSystemEventHandler
from watchdog.observers import Observer
import lifeviewConfig as cfg

try:
    class MyEventHandler(FileSystemEventHandler):
        def on_created(self, event: FileSystemEvent) -> None:
            print(event)
            file=event.src_path
            print(file)
            if not os.path.isfile(cfg.pathControlFile):
                print('open '+cfg.pathControlFile)
                startArray = [
                    cfg.irfanViewPath,
                    file
                ]
                subprocess.Popen(startArray)

    event_handler = MyEventHandler()
    observer = Observer()
    observer.schedule(event_handler, cfg.lifeviewPath, recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
    finally:
        observer.stop()
        observer.join()
except:
    print("Error at line", sys.exc_info()[2].tb_lineno, sys.exc_info())

input()

Und das Kontrollscript für das Sichten und Durchblättern.:

Code: Alles auswählen

import sys
import os
import subprocess
import tkinter as tk
from functools import partial
import glob
import lifeviewConfig as cfg

try:
    root = tk.Tk()
    root.title("Control For Lifeview")
    # Provide images
    # get directory of script, in config file now:
    # cfg.scriptPath = os.path.dirname(os.path.abspath(__file__))
    pathPlayImg = cfg.scriptPath + r"\images\buttonplay-3-32x36.png"
    pathPauseImg = cfg.scriptPath + r"\images\buttonpause-3-32x36.png"
    pathNextImg = cfg.scriptPath + r"\images\buttonnext-3-32x36.png"
    pathPrevImg = cfg.scriptPath + r"\images\buttonprev-3-32x36.png"
    playImg = tk.PhotoImage(file=pathPlayImg)
    pauseImg = tk.PhotoImage(file=pathPauseImg)
    nextImg = tk.PhotoImage(file=pathNextImg)
    prevImg = tk.PhotoImage(file=pathPrevImg)

    idx=0
    l=0
    def resumeIt():
        nextBtn.config(state=tk.DISABLED)
        prevBtn.config(state=tk.DISABLED)
        pauseBtn.config(state=tk.NORMAL)
        resumeBtn.config(state=tk.DISABLED)
        try:
            os.remove(cfg.pathControlFile)
        except:
            pass 
    def pauseIt():
        global idx, l, files
        with open(cfg.pathControlFile, "w") as f:
            f.write('paused')
        files=glob.glob(cfg.lifeviewPath+r'\*.ORF')
        l=len(files)
        if l > 0:
            idx=l-1
            startArray = [
                cfg.irfanViewPath,
                files[idx]
            ]
            subprocess.Popen(startArray)

        nextBtn.config(state=tk.NORMAL)
        prevBtn.config(state=tk.NORMAL)
        pauseBtn.config(state=tk.DISABLED)
        resumeBtn.config(state=tk.NORMAL)

        print(files)
    def openNext():
        global idx,l,files
        if idx < l-1:
            prevBtn.config(state=tk.NORMAL)
            idx=idx+1
            startArray = [
                cfg.irfanViewPath,
                files[idx]
            ]
            subprocess.Popen(startArray)
            if idx == l-1:
                nextBtn.config(state=tk.DISABLED)

    def openPrev():
        global idx, l, files
        if idx > 0:
            nextBtn.config(state=tk.NORMAL)
            idx=idx-1
            if idx==0:
                prevBtn.config(state=tk.DISABLED)
            startArray = [
                cfg.irfanViewPath,
                files[idx]
            ]
            subprocess.Popen(startArray)

    resumeBtn = tk.Button(
        root,
        bd=0,
        image=playImg,
        command=partial(resumeIt),
        state=tk.DISABLED
    )
    pauseBtn = tk.Button(
        root,
        bd=0,
        image=pauseImg,
        command=partial(pauseIt),
    )
    nextBtn = tk.Button(
        root,
        bd=0,
        image=nextImg,
        command=partial(openNext),
        state=tk.DISABLED
    )
    prevBtn = tk.Button(
        root,
        bd=0,
        image=prevImg,
        command=partial(openPrev),
        state=tk.DISABLED
    )

    lblStopResume = tk.Label(root, text="Stop/Resume Liveview", justify=tk.LEFT)
    lblPrevNext = tk.Label(root, text="Previous/Next Image", justify=tk.LEFT)
    pauseBtn.grid(row=0, column=0, padx=5, pady=5, sticky=tk.NW)
    resumeBtn.grid(row=0, column=1, padx=5, pady=5, sticky=tk.NW)
    prevBtn.grid(row=1, column=0, padx=5, pady=5, sticky=tk.NW)
    nextBtn.grid(row=1, column=1, padx=5, pady=5, sticky=tk.NW)
    lblStopResume.grid(row=0, column=2, padx=5, pady=5, sticky=tk.W)
    lblPrevNext.grid(row=1, column=2, padx=5, pady=5, sticky=tk.W)

    # sunValleyPath = cfg.scriptPath + r"\Sunvalley\sun-valley.tcl"
    # root.tk.call("source", sunValleyPath)
    # s = ttk.Style()
    # print(s.theme_names())
    # ttk.Style(root).theme_use("sun-valley-light")

except:
    print("Error", sys.exc_info()[2].tb_lineno, sys.exc_info())
input()
Und ein Configfile mit den gemeinsamen Variablen:

Code: Alles auswählen

import os

# Some variables common for main and control script:
irfanViewPath = r"C:\Program Files\Grafik\Irfanview\i_view64.exe"
lifeviewPath = r"D:\Gemeinsame Dateien\Astronomie\Lifeview"
scriptPath = os.path.dirname(os.path.abspath(__file__))
pathControlFile = scriptPath + r"\paused.txt"
Vielleicht noch nicht perfekt, aber wie oben: Bin noch nicht vollständig fit in Python.
Beste Grüße, Ulrich
Pedroski55
User
Beiträge: 61
Registriert: Freitag 25. Juli 2025, 00:20

So kann man nach neue Dateien suchen:

Code: Alles auswählen

from pathlib import Path
from datetime import datetime

acht_auf = Path('/home/peterr/temp/')
# ersteinmal Verzeichnis einlesen
vorher = {f for f in acht_auf.iterdir() if f.is_file()}
print(f'{len(vorher)} Dateien gefunden.') # 46 Dateien gefunden.

datei = Path('/home/peterr/temp/bin_neu.txt')
datei2= Path('/home/peterr/temp/bin_auch_neu.txt')

# mach 2 neue Dateien
with open(datei, 'a') as outfile:
        outfile.write('Alles paletti?')

with open(datei2, 'a') as outfile:
        outfile.write('Alles paletti?')


def check_it():
    nachher = {f for f in acht_auf.iterdir() if f.is_file() if f not in vorher}
    if len(nachher) == 0:
        print('Keine neuen Dateien gefunden.')
    else:
        for n in nachher:            
            print(f'Neue Datei gefunden: {n}')
        # voher so lassen oder neu einlesen je nachdem was man will
        #vorher = {f for f in acht_auf.iterdir() if f.is_file()}
Nun mal check_it() jede Stunde oder so laufen lassen, je nachdem wie dringend die Sache sei!
Antworten