2016-05-01 18 views
1

私のコードは、キャンバスを含むtopLevelウィンドウに画像をロードすることになっています。その画像から、その画像の矩形を2つ選択する必要があります。選択はメインGUIのキャンバスに表示されます。Tkinter、PIL、画像がトリミングされていません

私と同じ問題を抱える可能性のあるいくつかのトピック(such as this one)にアクセスしました。

  1. 変数idCrop = cropCanvas.create_image(0,0,anchor='nw',image=imgCropLoaded)が値1をとるというのが私のコードでお知らせ
  2. 、私は(コード怒鳴る参照)グローバル変数にimgLoadedimgCropLoadedを行うことによって提供されるソリューションを実装しようとしたが、それは私の問題を解決していませんデバッグ中に画像が表示されないという唯一の問題は
  3. です。コードをテストする場合は、実行してからJPEG/.jpgイメージをロードしてください。ロードされたら、それをクリックして(2番目のウィンドウで)、長方形をドラッグして選択すると、左上と右下の点の座標がコンソールに表示されます。

ここに私のコードは

from _functools import partial 
from tkinter import Tk, Menu, Canvas, Frame, Toplevel 
from tkinter.filedialog import askopenfilename 

from PIL import ImageTk, Image 


#Variables globales 
xSelectHG=0 
ySelectHG=0 

xSelectBD=0 
ySelectBD=0 

#last Rectangle Id 
idRectangle = 0 

#Image files references from PhotoImage 
imgLoaded = 0 
imgCropLoaded = 0 

# Functions 
def deleteRectangle(canvas,id): 
    canvas.delete(id) 
    return 

def startSelectPortion(event): 
    global xSelectHG 
    xSelectHG = event.x 

    global ySelectHG  
    ySelectHG = event.y 
    #print("[X,Y]Hg=",xSelectHG, ySelectHG) 
    return 
def stopSelectPortion(imgFile,cropCanvas,canvas,event): 

    #Delete previous rectangle 
    global idRectangle 
    deleteRectangle(canvas, idRectangle) 


    global xSelectBD 
    xSelectBD = event.x 

    global ySelectBD  
    ySelectBD = event.y 
    #print("[X,Y]BD=",xSelectBD, ySelectBD) 
    #print("[X,Y]BD=",xSelectBD, ySelectBD) 

    startCrop(imgFile,cropCanvas,canvas) 
    return 

def startCrop(imgFile, cropCanvas, canvas): 
    #Cropping an image 
    #Crop box: 
    #global xSelectHG, ySelectHG, xSelectBD, ySelectBD 
    print("[X,Y]Hg=",xSelectHG, ySelectHG) 
    print("[X,Y]BD=",xSelectBD, ySelectBD) 
    cropBox = (xSelectHG,ySelectHG,xSelectBD,ySelectBD) 
    imgCrop = imgFile.crop(cropBox) 
    global imgCropLoaded 
    imgCropLoaded = ImageTk.PhotoImage(imgCrop) 
    #Keeping a reference of the loaded image 
    cropCanvas.image = imgCropLoaded 
    cropCanvas.config(height=imgCrop.size[0],width=imgCrop.size[1]) 

    #This idCrop seems to be 1 during debuggin, so the image loads successfully, but it doesn't get displayed. 
    idCrop = cropCanvas.create_image(0,0,anchor='nw',image=imgCropLoaded) 
    global idRectangle 
    idRectangle=canvas.create_rectangle(xSelectHG,ySelectHG,xSelectBD,ySelectBD) 
    canvas.update() 
    cropCanvas.update() 
    return 

def openImage(topLevel,canvas, cropCanvas): 
    imgFormats = [("JPEG","*.jpg")] 
    imgName = askopenfilename(filetypes=imgFormats,title="Please choose an image of JPEG format") 
    imgFile = Image.open(imgName) 
    global imgLoaded 
    imgLoaded = ImageTk.PhotoImage(imgFile) 
    canvas.config(height=imgFile.size[0], width=imgFile.size[1]) 
    #Keeping a reference of the loaded image 
    canvas.img = imgLoaded 
    canvas.create_image(0,0,anchor='nw',image=imgLoaded) 
    canvas.grid(row=0,columns=1) 
    canvas.bind('<Button-1>',partial(startSelectPortion)) 
    canvas.bind('<ButtonRelease-1>',partial(stopSelectPortion, imgFile, cropCanvas, canvas)) 

    return 

def quit(): 
    gui.destroy() 
    return 
gui = Tk() 

#How to make this top level appear only when I click the button? 
imgTopLevel = Toplevel(gui) 

imgCanvas = Canvas(imgTopLevel, height=100, width=100) 
crpImgCanvas = Canvas(gui,height=100,width=100) 

menubar = Menu(gui) 
filemenu = Menu(menubar, tearoff=0) 
menubar.add_cascade(label="Files", menu=filemenu) 
filemenu.add_command(label="Open", command=partial(openImage, imgTopLevel,imgCanvas,crpImgCanvas)) 
menubar.add_separator() 
menubar.add_command(label="Quit", command=partial(quit)) 

gui.config(menu=menubar) 
gui.mainloop() 

答えて

1

が出てあなたのコードをテストし、あなたがそれを意図した通りに動作します(私はまだPythonとTkinterでは初心者です)です。キャンバスウィジェットをメインウィンドウに配置することを忘れただけです。 crpImgCanvas.grid()またはcrImgCanvas.pack()を追加すると、私のために働きました。がんばろう!

+0

ありがとうございます:) – Aetos

関連する問題