Прерывание для l oop с выбором кнопки - PullRequest
1 голос
/ 28 января 2020

В настоящее время я внедряю сортировщик изображений, который перемещает фотографию в каталог на основе нажатия кнопки. Когда каталог передается через cmd, запрос останавливает для l oop для каждой фотографии, однако при нажатии кнопки для l oop продолжается, пока не загрузится последняя фотография. Есть ли способ прервать l oop на первом изображении и дождаться нажатия кнопки, чтобы продолжить?

Код:

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 ]

1 голос
/ 28 января 2020

Сохраните ваши файлы в списке, отобразите первый файл, затем обновите изображение до следующего файла при нажатии кнопки

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
0 голосов
/ 29 января 2020

Вы можете создать итератор в списке файлов, возвращаемом os.listdir(...):

imagelist = iter(os.listdir(SourceList.source))

Затем создайте функцию для отображения изображения:

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

и измените MoveIm() функция для перемещения текущего изображения и отображения следующего изображения:

def MoveIm():
  if fullname:
    # and move the image
    shutil.move(fullname, 'C:\\Dest\\')
    # show next image
    NextImage()

Ниже приведен пример:

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()
0 голосов
/ 28 января 2020

Глядя на ваш код, кажется, что это намеренная проблема Вызовите свой метод / функцию внутри l oop. Ваш метод / функция вызывается после l oop, поэтому он берет последний файл в каталоге. Хотя я не знаю полной структуры вашего кода, но ниже приведена попытка ...

# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...