簡體   English   中英

如何在tkinter中使用y滾動條顯示多個圖像?

[英]how to display multiple images with y scrollbar in tkinter?

我對tkinter完全陌生,我正在嘗試分發多張圖片,用戶可以滾動查看這些圖片,這是我的最佳嘗試:

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

n = 128
path = "/media/mark/B37B-0280/img5/test/mm"
images = []
photos = []
cas = []
root = Tk()
frame = Frame(root)
frame.grid(row=0)
names = [name for name in os.listdir(path)]
images = [Image.open(path + "/" + name).resize((n, n)) for name in names]
photos = [ImageTk.PhotoImage(image) for image in images]
canvas = Canvas(frame, bg="yellow", width=n*len(names), height=n*len(names))
canvas.grid(row=0, sticky="news")
cas = [Canvas(canvas, width=n, height=n) for p in photos]

i = 0
for c, im in zip(cas, photos):
    c.create_image(n/2, n/2, image=im)
    c.grid(row=i)
    i += 1
vsb = Scrollbar(frame, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)
root.mainloop()

如您所見,有一個滾動條但不起作用,這是怎么回事? 如何解決?

圖像顯示正確,但滾動不起作用

編輯:如對這個問題的回答和評論中所述,放置在畫布中的小部件不會自動成為畫布項。 為此, canvas.create_window命令需要使用,如解釋在這里 我將在此答案的末尾編輯我的代碼,以使其按預期工作。


scrollregion Scrollbar添加到Canvas時,可能需要傳遞一個名為scrollregion的附加參數scrollregion必須“知道”要滾動到其坐標系的哪一部分。 所以加

canvas.config(scrollregion=canvas.bbox(ALL))

應該使它按預期工作。 canvas.bbox指定畫布的區域( 邊界框 ), ALL僅指定所有項目的邊界框。

除此之外,只有一些一般性提示:您可以刪除

images = []
photos = []
cas = []

部分,因為您以后還是要定義這些列表。 另外,甚至不必創建這些列表(至少與現在的代碼結構有關,如果以后需要對它們進行處理,它當然會很有用),您可以將所有這些放在一個循環中(代碼未測試!) 現在已編輯

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

n = 128
path = "/media/mark/B37B-0280/img5/test/mm"
root = Tk()
frame = Frame(root, width=n*number, height=n*number).grid(row=0)

number = len(os.listdir(path))
canvas = Canvas(frame, bg="yellow", width=n*number, height=n*number)

i = 0
for name in os.listdir(path):
    image = Image.open(path + "/" + name).resize((n, n))
    photo = ImageTk.PhotoImage(image)
    c = Canvas(canvas, width=n, height=n)
    c.create_image(n/2, n/2, image=photo)
    canvas.create_window(0, n*i, window=c)
    i += 1

vsb = Scrollbar(frame, orient=VERTICAL)
vsb.pack(side=RIGHT, fill=Y)
vsb.config(command=canvas.yview)
canvas.config(width=n * number, height=n * number)
canvas.config(yscrollcommand=vsb.set, scrollregion=canvas.bbox(ALL))
canvas.pack(side=LEFT,expand=True,fill=BOTH)

root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM