2017-01-15 3 views
0

Я загрузил изображение на метку tkinter, и это изображение дублируется на этой метке. Когда я нажимаю кнопку, мне нужно изменить это изображение. При нажатии кнопки старое изображение исчезло, но новое изображение не отображается Мой кодTkinter не меняет изображение при нажатии кнопки

import Tkinter as tk 
from PIL import Image, ImageTk 
root = tk.Tk() 

def change_pic(labelname): 
photo1 = ImageTk.PhotoImage(Image.open("demo.jpg")) 
labelname.configure(image=photo1) 
print "updated" 

vlabel=tk.Label(root) 
photo = ImageTk.PhotoImage(Image.open('cardframe.jpg')) 
vlabel.configure(image=photo) 
vlabel.pack() 
b2=tk.Button(root,text="Capture",command=lambda:change_pic(vlabel)) 
b2.pack() 
root.mainloop() 
+0

Я не знаю, если PIL такая же, как PhotoImage Tkinter в. В Python есть сборка мусора, и иногда она не делает того, что мы хотим. Что вам нужно сделать, чтобы получить изображение в виде отдельного экземпляра, тогда примените его к классу, иначе Python будет собирать ваш экземпляр изображения. 'image = Image.open (" demo.jpg ")' и 'photo = PhotoImage (изображение)' вместе могут работать. –

+0

@PrestonHager пробовал, но не работает – user6745741

ответ

0

следующие правки:

  1. Я организовал макет кода и упрощенный синтаксис , где это возможно. Это сделать ваш код более удобным для чтения.
  2. Обычно мы создаем объекты PIL подмножеством/дочерними элементами tk. До тех пор, пока он является частью корня (т. Е. Является дочерним элементом корня или любого из его дочерних виджетов), ваши объекты PIL будут работать.

Ваш рабочий код показан ниже:

import Tkinter as tk 
from PIL import Image, ImageTk 

def change_pic(): 
    vlabel.configure(image=root.photo1) 
    print "updated" 

root = tk.Tk() 

photo = 'cardframe.jpg' 
photo1 = "demo.jpg" 
root.photo = ImageTk.PhotoImage(Image.open(photo)) 
root.photo1 = ImageTk.PhotoImage(Image.open(photo1)) 

vlabel=tk.Label(root,image=root.photo) 
vlabel.pack() 

b2=tk.Button(root,text="Capture",command=change_pic) 
b2.pack() 

root.mainloop() 
1

в def change_pic(labelname), вам нужно добавить labelname.photo = photo1, чтобы убедиться, что photo1 не мусора.

def change_pic(labelname): 
    photo1 = ImageTk.PhotoImage(Image.open("demo.jpg")) 
    labelname.configure(image=photo1) 
    labelname.photo = photo1 
    print "updated" 

P.S. Похожее и labelname.photo = photo1 и labelname.image = photo1 работа.

Проверить это для более подробной информации: http://effbot.org/tkinterbook/label.htm

Вы можете использовать метку для отображения PhotoImage и BitmapImage объектов. При этом убедитесь, что вы сохраняете ссылку на объект изображения, , чтобы предотвратить его сбор мусора, собранный памятью Python. распределитель. Вы можете использовать глобальную переменную или атрибут экземпляра, или , просто добавьте атрибут к экземпляру виджета. были сделаны

Смежные вопросы