在 tkinter 中滚动浏览多个图像

scroll through multiple images in tkinter

我正在编写一个基于 tkinter 的脚本,它可以显示图像列表(这里有 3 个)。目标是能够使用滚动条位置浏览图像。这些图像不应连续显示,而是每个图像单独显示。 我搜索了很多这个问题,但都是关于连续滚动图像或滚动大图像。

目前我写的代码如下,但是只出现了第一张图。当我滚动时,没有任何反应。

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

def nex_img():
    i = scrollbar.get()
    print(i)
    canvas.create_image(20, 20, anchor=NW, image=listimg[int(i[0])])  

root = Tk()
image1=ImageTk.PhotoImage(Image.open('image1.png'))
image2=ImageTk.PhotoImage(Image.open('image2.png'))
image3=ImageTk.PhotoImage(Image.open('image3.png'))
listimg=[image1,image2, image3]

scrollbar = Scrollbar(master=root, orient=HORIZONTAL) 
scrollbar.pack(side=BOTTOM, fill=X)
canvas = Canvas(root,width = 800, height = 600,xscrollcommand=scrollbar.set) 
canvas.pack()
scrollbar.config(command=nex_img()) 
root.mainloop()

我哪里错了?

代码中的第一个问题,如评论中所述,

scrollbar.config(command=nex_img()) 

在执行代码时会执行一次nex_img,但自nex_img() returns None起不会将其设置为滚动条的命令。因此它应该被替换为

scrollbar.config(command=nex_img)

其次,由于图像不会连续滚动,我认为使用 ScaleScrollbar 更容易。特别是,您可以将 resolution 选项设置为 1,将值从 1 设置为 len(listimg),将 command 设置为 nex_img

这是一个例子:

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

def nex_img(i):   # takes the current scale position as an argument
    # delete previous image
    canvas.delete('image')
    # create next image
    canvas.create_image(20, 20, anchor=NW, image=listimg[int(i)-1], tags='image')

root = Tk()
image1 = ImageTk.PhotoImage(Image.open('image1.png'))
image2 = ImageTk.PhotoImage(Image.open('image2.png'))
image3 = ImageTk.PhotoImage(Image.open('image3.png'))
listimg = [image1, image2, image3]

scale = Scale(master=root, orient=HORIZONTAL, from_=1, to=len(listimg), resolution=1,
              showvalue=False, command=nex_img)
scale.pack(side=BOTTOM, fill=X)
canvas = Canvas(root, width=800, height=600)
canvas.pack()

# show first image
nex_img(1)

root.mainloop()