2016-08-18 18 views
0

私は2枚の写真を比較するオプションを持つアプリを作っています。私は画面の左側にリストボックスを置き、画面の右側には2つの写真の場所を置いています。リストボックスの下には、特定のタイトルの下に画像を配置するための3つのボタンがあります(図1または図2)。それは動作しますが、私は1枚の写真をPic 1とPic 2の両方に置くことができます。写真を1つ選択してPic 1の下に置き、別の写真を選択してPic 2の下に置くと、最初の写真が消えます。同じTkinter Toplevel()ウィンドウに2つの画像を表示するには

私の問題をよりよく理解するために、ここに私のアプリからの写真閲覧機能があります。前の関数で

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%わからないのpython 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

関連する問題