2017-02-06 3 views
1

저는 Tkinter에서 이미지 트리밍 프로그램을 만들고 있습니다. 제 기능 중 하나는 사용자가 선택한 이미지에서 Popart 스타일 이미지를 만듭니다. 그러나이 기능에는 상당한 시간이 걸리기 때문에 프로그램에서 팝업 이미지를 만드는 동안 "치료 중 이미지, 기다려주십시오 ..."라는 이미지를 추가하기로 결정했습니다. 그러나 수정은 적용되지 않습니다. 마치 내가 이미지를 표시하도록 요청한 부분을 건너 뛰는 것처럼 기능을 시작합니다. 이 문제 기능입니다 :Tkinter가 이미지를 표시하지 않습니다.

def usepop(): 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\traitement.png") #The image "traitement.png" doesn't get displayed 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 
    pop_art(a, None, coef=4) 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\PopArt\\Result Image\\result.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

그리고 여기에 전체 코드 :

from tkinter import* 
import tkinter as Tkinter 
from tkinter import filedialog, DISABLED, messagebox as tkMessageBox 
import os 
import ntpath 
from PIL import Image, ImageTk, ImageFilter 
import PIL 
from collections import Counter 
from random import randint 
import random 


def EchelleDeGris(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      o=int((p[0]+p[1]+p[2])/3) 
      px1[x,y]=(o,o,o) 
    Ima2.save(""+dir_path+"ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def SupprimerImage(): 
    I2 = Tkinter.Label(main, image=imt) 
    I2.grid(row=0, column=4, columnspan =4) 

def Luminosite(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      px1[x,y]=(p[0]+S1.get(),p[1]+S1.get(),p[2]+S1.get()) 
    Ima2.save(""+dir_path+"ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def AnnulerModifications(): 
    I2 = Tkinter.Label(main, image=im1) 
    I2.grid(row=0, column=4, columnspan =4) 

def get_pixel(pixels, x, y): 
    try: 
     return pixels[x, y] 
    except IndexError: 
     return None 


def get_neighbors(pixels, x, y): 
    neighbors = list() 
    neighbors.append(get_pixel(pixels, x, y - 1)) 
    neighbors.append(get_pixel(pixels, x, y + 1)) 
    neighbors.append(get_pixel(pixels, x - 1, y)) 
    neighbors.append(get_pixel(pixels, x + 1, y)) 
    neighbors.append(get_pixel(pixels, x - 1, y - 1)) 
    neighbors.append(get_pixel(pixels, x - 1, y + 1)) 
    neighbors.append(get_pixel(pixels, x + 1, y - 1)) 
    neighbors.append(get_pixel(pixels, x + 1, y + 1)) 
    return neighbors 


def filter_art(pixels, size): 
    indexes = dict() 
    for x in range(size[0]): 
     for y in range(size[1]): 
      color = get_pixel(pixels, x, y) 
      neighbors = get_neighbors(pixels, x, y) 
      new_color = Counter(neighbors).most_common()[0][0] 
      if new_color is not None: 
       indexes[x, y] = new_color 
    for x, y in indexes: 
     pixels[x, y] = indexes[x, y] 


def pop_art(path_orig, path_mod, coef): 

    s=[] 
    for i in range(9): 

     r=(randint(0,255), randint(0,255), randint(0,255)) 
     g=(randint(0,255), randint(0,255), randint(0,255)) 
     b=(randint(0,255), randint(0,255), randint(0,255)) 

     image_orig = Image.open(path_orig) 
     size = image_orig.size 
     image_mod = Image.new("RGB",(size[0],size[1])) 
     pixels_orig = image_orig.load() 
     pixels_mod = image_mod.load() 
     for x in range(size[0]): 
      for y in range(size[1]): 
       p = pixels_orig[x, y] 
       if isinstance(p, int): 
        rgb = (p,p,p) 
       elif isinstance(p, tuple) and len(p) in (3, 4): 
        rgb = p[:3] 
       else: 
        raise TypeError('Unknown pallete') 
       average_color = sum(rgb)/3 
       if average_color <= 85: 
        pixels_mod[x, y] = r 
       elif 85 < average_color <= 170: 
        pixels_mod[x, y] = g 
       elif average_color > 170: 
        pixels_mod[x, y] = b 
     for _ in range(coef): 
      filter_art(pixels_mod, size) 
     image_mod.save(''+dir_path+'\\PopArt\\Modified Images\\result'+str(i)+'.png') 
     Img=[None]*9 
    for i in range(9): 
     Img[i]=Image.open(""+dir_path+"\\PopArt\\Modified Images\\result"+str(i)+".png") 
     basewidth = int(Img[i].size[1]/3) 
     wpercent = (basewidth/float(Img[i].size[0])) 
     hsize = int((float(Img[i].size[1]) * float(wpercent))) 
     Img[i] = Img[i].resize((basewidth , hsize), PIL.Image.ANTIALIAS) 
     Img[i].save(''+dir_path+'\\PopArt\\Resized Images\\resized_image'+str(i)+'.png') 


    Img1=[None]*9 
    pixels1=[None]*9 
    Imaz=Image.new("RGB",(basewidth*3,hsize*3)) 
    pixels=Imaz.load() 
    for i in range(9): 
     Img1[i]=Image.open(''+dir_path+'\\PopArt\\Resized Images\\resized_image'+str(i)+'.png') 
     pixels1[i]=Img1[i].load() 


    for x in range(0,basewidth): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[0][x,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[1][x,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[2][x,y-hsize*2] 

    for x in range(basewidth,basewidth*2): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[3][x-basewidth,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[4][x-basewidth,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[5][x-basewidth,y-hsize*2] 

    for x in range(basewidth*2,basewidth*3): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[6][x-basewidth*2,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[7][x-basewidth*2,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[8][x-basewidth*2,y-hsize*2] 
    Imaz = Imaz.resize((size[0] , size[1]), PIL.Image.ANTIALIAS) 
    Imaz.save(""+dir_path+"\\PopArt\\Result Image\\result.png") 


def usepop(): 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\traitement.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 
    pop_art(a, None, coef=4) 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\PopArt\\Result Image\\result.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def change_contrast(level): 

    img = Image.open(a) 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      new_color = tuple(int(factor * (c-128) + 128) for c in color) 
      img.putpixel((x, y), new_color) 

    return img 

def use_contrast(): 
    result = change_contrast(S2.get()) 
    result.save(""+dir_path+"ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def recherche_contours(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      o=int((p[0]+p[1]+p[2])/3) 
      px1[x,y]=(o,o,o) 
    Ima2 = Ima2.filter(ImageFilter.FIND_EDGES) 
    Ima2.save(""+dir_path+"ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 




main=Tk() 

main.withdraw() 
a = filedialog.askopenfilename() 
main.deiconify() 

dir_path = os.path.dirname(os.path.realpath("Test2.py")) 

main.configure(background="#a1dbcd") 
main.title("Photoshop Version.Megzari") 

Ima1=Image.open(a) 
z=Ima1.size 
nux=Image.new("RGB",(z[0],z[1])) 
nuxy=nux.load() 
for x in range(z[0]): 
    for y in range(z[1]): 
     nuxy[x,y]=(255,255,255) 
nux.save("Blank.png") 








if z>(400,400): 
    main.withdraw() 
    tkMessageBox.showinfo("Resolution Error", "The image is too big, please select a smaller one.") 
    sys.exit() 


elif z<(400,400): 
    im1 = ImageTk.PhotoImage(file=a) 
    I1 = Tkinter.Label(main, image=im1) 
    I1.grid(row=0, column=1, columnspan =3) 
    imt = ImageTk.PhotoImage(file="Blank.png") 
    T1 = Tkinter.Label(main, image=imt) 
    T1.grid(row=0, column=4, columnspan =4) 
    B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=NORMAL) 
    B1.grid(padx=20, pady=20, row=1, column=0) 
    B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39") 
    B3.grid(padx=20, pady=20, row=1, column=1) 
    S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200) 
    S1.grid(row=2, column=1) 
    B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39") 
    B2.grid(padx=20, pady=20, row=1, column=7) 
    B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39") 
    B3.grid(padx=20, pady=20, row=1, column=6) 
    B4 = Tkinter.Button(main, text ="Pop Art", command = usepop, fg="#a1dbcd", bg="#383a39") 
    B4.grid(padx=20, pady=20, row=1, column=3) 
    S2 = Scale(main, from_=-258, to=258, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200) 
    S2.grid(row=2, column=4) 
    B4 = Tkinter.Button(main, text ="Appliquer Contraste", command = use_contrast, fg="#a1dbcd", bg="#383a39") 
    B4.grid(padx=20, pady=20, row=1, column=4) 
    B5 = Tkinter.Button(main, text ="Trouver Contours", command = recherche_contours, fg="#a1dbcd", bg="#383a39") 
    B5.grid(padx=20, pady=20, row=1, column=5) 

    s=S1.get() 
    s2=S2.get() 




main.mainloop() 

이 내가 표시하기 위해 노력하고있어 이미지는 (그것은 당신이 궁금해 경우 프랑스어의) : traitement.png

내 변수 이름이 너무 짧다는 것을 알고 있으며, 내가 가지고있는 나쁜 습관이며,이를 없애려고 노력하고 있습니다. 따라서 내 코드와 함께 곰곰이 생각해보십시오. 사람들이 이해하기가 더 어려워집니다. 그래서이 k 도와주세요. ind of code.

+0

메신저 모두 읽지 않고 있습니다. 오류를 일으키는 원인이 무엇인지 모두에게 알려주시겠습니까? – WhatsThePoint

+0

아, 그것은'usepop() :'이었습니다. 그러나 실수로'def use_contrast() :'를 복사했습니다. 혼란스럽게해서 죄송합니다. 게시물에서 수정했습니다. –

+1

문제를 집중적으로 다루는 [mcve]에 코드를 압축하십시오. –

답변

1

주요 문제는 def usepop()에 있습니다. 이미지를 레이블 I2에로드하고 격자 레이블 I2에 대한 명령을 위치에 입력 한 후에는 pop_art() 함수를 실행했습니다. 이 기능은 이미지를 팝 아트로 변환하기 위해 CPU 집중적 인 활동을 시작했습니다. 이 '소동'중에 그리드 I2에 대한 지시가 수행되지 않았습니다. 즉, CPU가 이미지를 변환하는 중 유휴 상태였습니다. 이 문제를 방지하려면 아래와 같이 pop_art()을 활성화하기 전에 I2.update_idletasks() 명령을 실행하십시오. 그것은 내 시스템에서 작동했습니다.

def usepop(): 
    #im2 = ImageTk.PhotoImage(file=""+dir_path+"\\traitement.png") 
    print(dir_path) 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\traitement.png") #The image "traitement.png" doesn't get displayed) 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 
    I2.update_idletasks() # Add this to ensure I2.grid is performed first and not remain idle. 
    pop_art(a, None, coef=4) 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\PopArt\\Result Image\\result.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 
+0

나는 그런 식으로 일한 프로그램을 몰랐다. 이제부터는 프로그램을 작성할 때 다음 번에 이것을 고려해 볼 것입니다. 도와 줘서 고마워, 잠시 나를 괴롭혔다. 그건 그렇고, 오늘 나는 그들을 모두 사용했기 때문에 upvote 할 수 없다 : p –

+0

다행 당신을 위해 일했다. 그 다음날. ;) –