![](/img/trans.png)
[英]How can i display a long string (paragraphs) in a label widget on multiple lines with a y scrollbar? (tkinter)
[英]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.