J'implémente actuellement un trieur d'images qui déplace une photo vers un répertoire en appuyant sur un bouton. Lorsque le répertoire est donné via cmd, l'invite arrête la boucle for pour chaque photo mais avec le bouton appuyez sur la boucle for continue jusqu'à ce qu'elle charge la dernière photo. Existe-t-il un moyen d'interrompre la boucle à la première image et d'attendre que l'on appuie sur un bouton pour continuer?
Code:
for file in os.listdir(SourceList.source): photo = Image.open(SourceList.source+file).resize((750,500), Image.ANTIALIAS) img = ImageTk.PhotoImage(photo) panel = Label(self, image = img) panel.image = img panel.grid(row=0, rowspan=2, column=1, columnspan=2, sticky=N) #panel.pack(side = "top", fill = "none") #Moves image based on button pressed def MoveIm(num): if num == 1: #If button X clicked, set dest dest = 'C:\\Dest\\' shutil.move(SourceList.source+file, dest) button1 = Button(self, text = "Dest",command = partial(MoveIm, 1)) button1.grid(row=0, column=0, pady=50, padx=50, sticky=N)
3 Réponses :
Stockez vos fichiers dans une liste, affichez le premier fichier puis mettez à jour l'image vers le fichier suivant lorsque vous appuyez sur le bouton
def MoveIm(num): if num == 1: #If button X clicked, set dest dest = 'C:\\Dest\\' shutil.move(SourceList.source+file, dest) #update image shown at this point
Merci pour cela, je suis nouveau dans la programmation en général, alors laissez-moi voir si je comprends ce que vous voulez dire. Dans la boucle for, tout ce que je ferais est de stocker tous les fichiers dans une liste d'une manière ou d'une autre. Ensuite, utilisez le même code que j'ai pour afficher les images mais à partir de cette nouvelle liste. Ensuite, ajoutez du code dans MoveIm pour progresser dans la liste?
Ouais c'est exactement ça. Utilisez donc simplement ce code pour définir la première image de votre liste comme image d'affichage, puis chaque fois que vous exécutez votre fonction MoveIm, vous mettez à jour l'image affichée vers l'image suivante dans la liste. Vous devez également vérifier que vous avez une image suivante - il existe de nombreuses façons de le faire, les itérateurs seraient le moyen le plus propre, mais si vous êtes nouveau dans la programmation, il vous sera probablement plus logique à ce stade de garder un compteur que vous incrémentez chaque fois que vous obtenez une nouvelle image. Avant d'obtenir l'image suivante, vérifiez que le compteur est un index valide (c'est-à-dire inférieur à len (list_of_files))
En regardant votre code, il semble y avoir un problème d'intention. Appelez votre méthode / fonction à l'intérieur de la boucle. votre méthode / fonction est appelée après la boucle est terminée donc elle prend le dernier fichier dans le répertoire. Bien que je ne connaisse pas la structure complète de votre code, mais ci-dessous est juste un essai ...
# Moves image based on button pressed def MoveIm(num): if num == 1: # If button X clicked, set dest dest = 'C:\\Dest\\' shutil.move(SourceList.source+file, dest) for file in os.listdir(SourceList.source): photo = Image.open(SourceList.source+file).resize((750,500), Image.ANTIALIAS) img = ImageTk.PhotoImage(photo) panel = Label(self, image = img) panel.image = img panel.grid(row=0, rowspan=2, column=1, columnspan=2, sticky=N) #panel.pack(side = "top", fill = "none") # To be called inside the loop button1 = Button(self, text = "Dest",command = partial(MoveIm, 1)) button1.grid(row=0, column=0, pady=50, padx=50, sticky=N)
Vous pouvez créer un itérateur sur la liste de fichiers renvoyée par os.listdir(...)
:
import tkinter as tk from PIL import Image, ImageTk import os import shutil # simulate your SourceList object class SourceList: source = '/path/to/images' def NextImage(): global fullname fname = next(imagelist, None) fullname = os.path.join(SourceList.source, fname) if fname else None if fullname: photo = Image.open(fullname).resize((750, 500), Image.ANTIALIAS) img = ImageTk.PhotoImage(photo) # update panel instead of creating new one panel.config(image=img) else: # create a blank image photo = Image.new('RGB', (750, 500), 'white') img = ImageTk.PhotoImage(photo) panel.config(text='No more image', font=('Arial', 64, 'bold'), image=img, compound=tk.CENTER) panel.image = img def MoveIm(): if fullname: # and move the image shutil.move(fullname, 'C:\\Dest\\') # show next image NextImage() root = tk.Tk() panel = tk.Label(root) panel.pack() button1 = tk.Button(root, text='Dest', command=MoveIm) button1.pack() imagelist = iter(os.listdir(SourceList.source)) NextImage() # show the first image root.mainloop()
Ensuite, créez une fonction pour afficher l'image:
def MoveIm(): if fullname: # and move the image shutil.move(fullname, 'C:\\Dest\\') # show next image NextImage()
et modifiez la fonction MoveIm ()
pour déplacer l'image actuelle et afficher l'image suivante:
def NextImage(): global fullname fname = next(imagelist, None) fullname = os.path.join(SourceList.source, fname) if fname else None if fullname: photo = Image.open(fullname).resize((750, 500), Image.ANTIALIAS) img = ImageTk.PhotoImage(photo) # update panel instead of creating new one panel.config(image=img) else: # create a blank image photo = Image.new('RGB', (750, 500), 'white') img = ImageTk.PhotoImage(photo) panel.config(text='No more image', font=('Arial', 64, 'bold'), image=img, compound=tk.CENTER) panel.image = img
Voici un exemple:
imagelist = iter(os.listdir(SourceList.source))
vous voulez demander le choix avant de déplacer l'image..si OUI déplacez-vous si NON ne bougez pas .. ??
Non, je veux que l'image se déplace tout de suite en appuyant sur un bouton, puis le programme présentera l'image suivante. Pour le moment, il passe directement à la dernière image lorsque je l'exécute. J'ai besoin d'un moyen de l'arrêter à chaque image jusqu'à ce que je clique sur le bouton