2016-06-12 2 views
0

Im в настоящее время пытается изменить изображение в виджере метки tkinter, используя привязку к ключу возврата. После нажатия клавиши возврата я хочу, чтобы изображение изменилось на «im2», затем подождите 2 секунды и снова измените на «im3». код я использую до сих пор:Изображение в метке не меняет меня после вызова функции

window = tk.Tk() 
window.title("Testwindow") 
window.geometry("800x800") 
window.configure(background='grey') 

# images 
im1_path = "im1.gif" 
im2_path = "im2.gif" 
im3_path = "im3.gif" 
im1 = ImageTk.PhotoImage(Image.open(im1_path)) 
im2 = ImageTk.PhotoImage(Image.open(im2_path)) 
im3 = ImageTk.PhotoImage(Image.open(im3_path)) 

panel = tk.Label(window, image = im1) 
panel.pack(side = "bottom", fill = "both", expand = "yes") 

def callback(e): 
    panel.configure(image = im2) 
    panel.image = im2 

    time.sleep(2) 

    panel.configure(image = im3) 
    panel.image = im3 

window.bind("<Return>", callback) 
window.mainloop() 

Но вместо того, чтобы изменить изображение в два раза только меняется один раз в «IM3» 2 секунды после нажатия кнопки возврата, так или иначе не отображается первое изменение. Кто-нибудь знает, почему?

+0

изменения не отражаются в пользовательском интерфейсе, пока он выполняет код , Обновления происходят только в 'mainloop()'. – msw

+1

Также см. Http://stackoverflow.com/questions/30284270/why-does-time-sleep-pause-tkinter-window-before-it-opens и http://stackoverflow.com/questions/33175457/time-sleep -equivalent-on-tkinter –

+0

@ PM2Ring, Спасибо большое! –

ответ

4

time.sleep() не будет работать здесь, так как он останавливает выполнение программы, вам нужно будет использовать after ... и его также плохой практикой использовать sleep в программировании GUI.

root.after(time_delay, function_to_run, args_of_fun_to_run)

Так что в вашем случае это будет нравится

def change_image(): 
    panel.configure(image = im3) 
    panel.image = im3 

и в функции обратного вызова

def callback(e): 
    panel.configure(image = im2) 
    panel.image = im2 
    #after 2 seconds it'll call the above function 
    window.after(2000, change_image) 
Смежные вопросы