2016-08-18 7 views
0

그래서 두 장의 사진을 비교할 수있는 앱을 만들고 있습니다. 나는 스크린의 왼쪽에리스트 박스를 놓았고, 스크린의 오른쪽에 두 개의 사진을위한 장소를 놓았다. 목록 상자 아래에는 특정 제목 아래 그림을 배치하는 데 사용되는 세 개의 단추가 있습니다 (그림 1 또는 그림 2). 그것은 작동하지만 Pic 1과 Pic 2 모두에 하나의 사진 만 넣을 수 있습니다. 하나의 사진을 선택하여 Pic 1에 놓은 다음 다른 사진을 선택하여 Pic 2에 놓으면 첫 번째 사진이 사라집니다.동일한 Tkinter Toplevel() 창에 두 개의 이미지를 표시하는 방법

내 문제를 더 잘 이해하기 위해 여기 내 사진의 사진 탐색 기능이 있습니다.

from Tkinter import * 
import tkMessageBox 
from PIL import ImageTk, Image 

def photo_browse(): 

    def add_photo (screen, column_num): 

     if not "pic" in globals(): 
      tkMessageBox.showerror ("Error!", "No picture selected!") 
      screen.lift() 
     else: 
      screen.image = pic 
      can = Label (screen, image = pic) 
      can.grid (row = 0, column = column_num) 
      Label (screen, text = chosen_photo).grid (row = 1, column = column_num) 

    def selection_listbox (evt): 

     global chosen_photo 
     chosen_photo = str (photo_listbox.get (photo_listbox.curselection())) 
     image_location = "Pics/" + chosen_photo 
     global pict 
     pict = Image.open (image_location) 
     global pic 
     pic = ImageTk.PhotoImage (pict) 

    import glob 

    photo_browse_screen = Toplevel() 
    photo_browse_screen.title ("Photo browse") 
    photo_browse_screen.geometry ("1000x600") 
    photo_browse_screen.resizable (0, 0) 
    photo_listbox = Listbox (photo_browse_screen, width = 50, height = 35) 
    photo_listbox.grid (columnspan = 3) 
    photo_listbox.bind ('<<ListboxSelect>>', selection_listbox) 
    name_list = glob.glob ("Pics/*.jpg") 
    name_list = [i [6:] for i in name_list] 
    name_list.sort() 
    n = 1 
    m = 0 
    for i in name_list: 
     photo_listbox.insert (n, name_list [m]) 
     n += 1 
     m += 1 
    Button (photo_browse_screen, text = "PIC 1", command = lambda: add_photo (photo_browse_screen, 4)).grid (row = 1, column = 0) 
    Button (photo_browse_screen, text = "PIC 2", command = lambda: add_photo (photo_browse_screen, 5)).grid (row = 1, column = 1) 
    Button (photo_browse_screen, text = "EXIT", command = photo_browse_screen.destroy).grid (row = 1, column = 2) 
    can_pic_1 = Label (photo_browse_screen, text = "Pic 1", font= "-weight bold") 
    can_pic_1.grid (row = 0, column = 4, padx = (200, 100), sticky = N) 
    can_pic_2 = Label (photo_browse_screen, text = "Pic 2", font= "-weight bold") 
    can_pic_2.grid (row = 0, column = 5, padx = (100, 150), sticky = N) 

root = Tk() 
root.title ("Main menu") 
root.geometry ("1000x600") 
root.resizable (0, 0) 
main_menu = Menu (root) 

photos_menu = Menu (main_menu, tearoff = 0) 

main_menu.add_cascade (label = "Photos", menu = photos_menu) 
photos_menu.add_command (label = "Browse photos", command = photo_browse) 

root.config (menu = main_menu) 

root.mainloop() 

이전 기능 (사진 추가)에서 사진을 308x440 크기로 조정하여이 창에 완벽하게 맞 춥니 다.

내 코드를 검토 한 결과 global 변수가이 문제를 일으키는 것이 거의 확실하므로 누구나 대안을 제공 할 수 있다면 감사 할 것입니다.

+0

당신이 프레임과 같은 별도의 용기에 그들을 가하고 해봤이 후 목록 작업을 수행 할 필요가 없습니다? –

+0

나는 ... 어떻게 할 수 있습니까? 내가 아는 한, 프레임에는 이미지를 넣을 수있는 옵션이 없습니다 ... – mdenci

답변

0

나는 그래서 난이 나는 목록에 모두 추가

내가 여러 이미지를 사용할

(나를 위해 Tkinter를 Tkinter는이) 당신을 위해 작동 100 % 확실하지 않다 파이썬 3.4을 사용하고, 당신 그

이 항상 나를 위해 일을하고 난 당신이 목록없이 설명 같은 문제

from Tkinter import * 
import tkMessageBox 
from PIL import ImageTk, Image 

global all_images 
all_images = [] 

def photo_browse(): 
    def selection_listbox (evt):  
     global chosen_photo 
     chosen_photo = str (photo_listbox.get (photo_listbox.curselection())) 
     image_location = "Pics/" + chosen_photo 
     global pict 
     pict = Image.open (image_location) 
     global pic 
     pic = ImageTk.PhotoImage (pict) 

     # adding all the images to a list has worked for me in the past 
     global all_images 
     all_images = all_images + [chosen_photo, pic, pict] 
+0

아주 잘 작동합니다, 감사합니다! 나는 아직 초보자이지만,이 예제를 통해 전역 변수가 야기 할 수있는 문제를 보았고 앞으로는이를 피하기 위해 최선을 다할 것입니다! – mdenci

관련 문제