1
votes

Interruption pour boucle avec sélection de bouton

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)


2 commentaires

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


3 Réponses :


1
votes

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


2 commentaires

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))



0
votes

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)


0 commentaires

0
votes

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))


0 commentaires