2017-05-03 17 views
0

私は、画像を含むフォルダを選択して各画像にユーザのクリック座標を保存するスクリプトを作成しようとしています。これを行うには、各画像ファイルをTkinterキャンバスに表示し、クリック位置を保存してから、キャンバスを閉じたときに次の画像を開きたいと思います。PythonでTkinterキャンバスを使って画像をループする

これは、以下のコード(this questionに適合)を使用して1つの画像で動作するようになります。私はfor File in imgsループが次の画像を開いたままにしておくことを望んでいましたが、そうではありません。私はon_closing関数がTkinterに別のイメージを開くように伝える必要があると思います。

画像を閉じた後、Tkinterに次の画像を開く適切な方法はありますか?

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

それはスクロール可能である必要はありません、私はちょうどクリック位置を取得する必要があります。私はLabelウィジェットを一度も使用していないので、あなたの質問には良い答えはありませんが、私は提案には触れています。 – Bird

答えて

1

あなたの代わりにラベルを使用することができる場合、それは非常に簡単に次のようになります。また

は、Tkinter.PhotoImageとしてのTkinterに内蔵されているファイルから画像を読み込むので、ImageTkを使用する理由はありません注意してください。

また、ワイルドカードのインポートを通常のインポートに変換しました。ワイルドカードのインポートは面倒で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

関連する問題