I am trying to build an image viewer using Tkinter but I am stuck at this weird problem

Viewed 428

I have this forward arrow button, which when clicked should display the next image in the picturesList. The initial image works fine, but the moment I click the forward button I get this.

Before Clicking

enter image description here

After Clicking:

enter image description here

I am adding the entire code, because I can't really understand where the problem actually is, apologies for it.

from tkinter import *
from PIL import ImageTk, Image
import os

def moveForward():
    global currImageIndex
    global imgLabel
    currImageIndex += 1

    imgLabel.grid_forget()
    print(picturesList)
    img = ImageTk.PhotoImage(Image.open(picturesList[currImageIndex]))
    imgLabel = Label(root,image=img)
    imgLabel.grid(row=0,column=1)

picturesList = []
for pictures in os.listdir('images'):
    if pictures.startswith('img'):
        picturesList.append('images/'+pictures)

currImageIndex = 0

root = Tk()

img = ImageTk.PhotoImage(Image.open("images/img5.jpg"))
imgLabel = Label(image=img)
imgLabel.grid(row=0,column=1)

backwardImg = ImageTk.PhotoImage(Image.open("images/backward.ico"))
backButton = Button(image=backwardImg,width=80,height=80,relief=FLAT)
backButton.grid(row=0,column=0)


forwardImg = ImageTk.PhotoImage(Image.open("images/forward.ico"))
forwardButton = Button(image=forwardImg, width=80, height=80, relief=FLAT, command=moveForward)
forwardButton.grid(row=0,column=2)

root.mainloop()
1 Answers

Keep a reference to the image

from tkinter import *
from PIL import ImageTk, Image
import os

def moveForward():
    global current_img
    global currImageIndex
    global imgLabel
    currImageIndex += 1

    imgLabel.grid_forget()
    print(picturesList)
    img = ImageTk.PhotoImage(Image.open(picturesList[currImageIndex]))
    current_img = img
    imgLabel = Label(root,image=img)
    imgLabel.grid(row=0,column=1)

picturesList = []

#Here is the variable where the reference will be stored
current_img = None
for pictures in os.listdir('images'):
    if pictures.startswith('img'):
        picturesList.append('images/'+pictures)

currImageIndex = 0

root = Tk()

img = ImageTk.PhotoImage(Image.open("images/img5.jpg"))
imgLabel = Label(image=img)
imgLabel.grid(row=0,column=1)

backwardImg = ImageTk.PhotoImage(Image.open("images/backward.ico"))
backButton = Button(image=backwardImg,width=80,height=80,relief=FLAT)
backButton.grid(row=0,column=0)


forwardImg = ImageTk.PhotoImage(Image.open("images/forward.ico"))
forwardButton = Button(image=forwardImg, width=80, height=80, relief=FLAT, command=moveForward)
forwardButton.grid(row=0,column=2)

root.mainloop()
Related