2017-05-03 5 views
0

사용자가 이미지가있는 폴더를 선택하고 각 이미지에 사용자의 클릭 좌표를 저장할 수있는 스크립트를 작성하려고합니다. 이렇게하려면 각 이미지 파일을 Tkinter 캔버스에 표시하고 클릭 위치를 저장 한 다음 캔버스가 닫히면 다음 이미지를 열고 싶습니다.Python에서 Tkinter canvas로 이미지 반복하기

아래와 같은 코드로 단일 이미지에서이 기능을 사용할 수 있습니다 (this question에서 수정). for File in imgs 루프가 다음 이미지를 계속 열어주기를 기대했지만 그럴 수는 없습니다. 나는 Tkinter가 다른 이미지를 열라고 알려주기 위해 on_closing 함수가 필요하다고 생각합니다.

Tkinter가 이미지를 닫은 후 다음 이미지를 열려면 적절한 방법은 무엇입니까?

또한

Tkinter.PhotoImage로는 Tkinter에 내장 된 파일에서 이미지를로드하기 때문에 ImageTk를 사용할 필요는 없다 참고 : 대신 라벨을 사용할 수 있는지

from Tkinter import * 
from tkFileDialog import askopenfilenames, askopenfilename, askdirectory 
from PIL import Image, ImageTk 
import cv2 
import numpy as np 
import os 

if __name__ == "__main__": 
    root = Tk() 

    #setting up a tkinter canvas with scrollbars 
    frame = Frame(width=1920, height=1080, bd=2, relief=SUNKEN) 
    frame.grid_rowconfigure(0, weight=1) 
    frame.grid_columnconfigure(0, weight=1) 
    xscroll = Scrollbar(frame, orient=HORIZONTAL) 
    xscroll.grid(row=1, column=0, sticky=E+W) 
    yscroll = Scrollbar(frame) 
    yscroll.grid(row=0, column=1, sticky=N+S) 
    canvas = Canvas(frame, bd=0, xscrollcommand=xscroll.set, yscrollcommand=yscroll.set) 
    canvas.config(width=1920, height=1080) 
    canvas.grid(row=0, column=0, sticky=N+S+E+W) 
    xscroll.config(command=canvas.xview) 
    yscroll.config(command=canvas.yview) 
    frame.pack(fill=BOTH,expand=1) 

    # Function to be called when mouse is clicked 
    def save_coords(event): 
     coords.append([event.x, event.y]) 

    # def on_closing(): 
     # Open the next image file 


    # Create empty list for coordinate arrays to be appended to 
    coords = [] 

    # Choose multiple images 
    img_dir = askdirectory(parent=root, initialdir="D:/Temp/", title='Choose folder') 
    os.chdir(img_dir) 
    imgs = os.listdir(img_dir) 
    #imgs = askopenfilenames(parent=root, initialdir="D:/Temp/cvCal/", title='Choose images') 
    for File in imgs: 
     img = ImageTk.PhotoImage(Image.open(File).resize((1280,720), Image.ANTIALIAS)) 
     canvas.create_image(0,0,image=img,anchor="nw") 
     canvas.config(scrollregion=canvas.bbox(ALL)) 
     canvas.bind("<Button 1>",save_coords) 
     # on_closing()... 

    root.mainloop() 
+0

왜 이미지가 표시되는 대신 캔버스를 사용 하시겠습니까? 스크롤 할 수있는 이미지가 필요합니까? – Novel

+0

스크롤 할 필요가 없으며 클릭 위치를 가져와야합니다. 나는 라벨 위젯을 사용한 적이 없으므로 나는 당신의 질문에 대한 좋은 답변을 정말로 가지고 있지 않다. 그러나 나는 제안에 개방적이다. – Bird

답변

1

그것은 훨씬 쉽게 될 것입니다.

또한 와일드 카드 가져 오기를 일반 가져 오기로 변환했습니다. 와일드 카드 수입은 PEP8에 비해 지저분합니다.

마지막으로 '닫는 중'이라는 말의 의미를 모르겠으므로 다음 이미지로 넘어갈 수있는 버튼을 추가했습니다. 이렇게하면 처리해야하는 마지막 이미지에 StopIteration 오류가 발생합니다.

import Tkinter as tk 
from tkFileDialog import askdirectory 
import os 

# Create empty list for coordinate arrays to be appended to 
coords = [] 

# Function to be called when mouse is clicked 
def save_coords(event): 
    click_loc = [event.x, event.y] 
    print "you clicked on", click_loc 
    coords.append(click_loc) 

# Function to load the next image into the Label 
def next_img(): 
    img_label.img = tk.PhotoImage(file=next(imgs)) 
    img_label.config(image=img_label.img) 

root = tk.Tk() 

# Choose multiple images 
img_dir = askdirectory(parent=root, initialdir="D:/Temp/", title='Choose folder') 
os.chdir(img_dir) 
imgs = iter(os.listdir(img_dir)) 

img_label = tk.Label(root) 
img_label.pack() 
img_label.bind("<Button-1>",save_coords) 

btn = tk.Button(root, text='Next image', command=next_img) 
btn.pack() 

next_img() # load first image 

root.mainloop() 

print coords 
+0

그 덕분에, 고마워! ImageTk 부분을 사용하여 png 파일을 열었습니다.이 파일은 일반 tkinter에서만 작동하지 않습니다. 새로운 tkinter 위젯을 배우는 것도 좋습니다. – Bird