[英]Tkinter; how to use scrollbar in a popup/top-level window that opens when a button is pressed in main root window
[英]Images do not get shown in a scroll view associated top-level window in python tkinter
我一直在尝试制作一个顶层窗口视图,该视图收集并显示第10列的文件夹中存在的所有图像。如果图像大于窗口分配的大小,我希望可以滚动浏览图片。 我按照对Scrollable Toplevel Window(tkinter)给出的答案正确地将图像添加到画布上并可以滚动它们。 但是,就我而言,整个弹出窗口只是空白。 这是代码
import tkinter as tk
from tkinter import *
import glob
import os
from PIL import Image, ImageTk
def pop_up_window():
win = Toplevel()
vbar = tk.Scrollbar(win, orient = VERTICAL)
vbar.grid(row = 0, column = 1, sticky = "ns")
container = tk.Canvas(win, height=300, width=720, scrollregion=(0, 0, 300, 720))
container.grid(row = 0, column = 0, sticky = "nsew")
vbar.config(command=container.yview)
container.config(yscrollcommand=vbar.set)
path = "D:\\image_collection"
COLUMNS = 10
image_count = 0
for infile in glob.glob(os.path.join(path, '*.jpg')):
image_count += 1
r, c = divmod(image_count-1, COLUMNS)
im = Image.open(infile)
resized = im.resize((100, 100), Image.ANTIALIAS)
img_part = ImageTk.PhotoImage(Image.open(infile).resize((100, 100), Image.ANTIALIAS))
image_in_canvas = container.create_image(r, c, image = img_part)
win.rowconfigure(0, weight=1)
win.columnconfigure(0, weight=1)
root = Tk()
button = Button(root, text='Call Pop-up window', command = pop_up_window)
button.place(x = 0, y = 0)
root.mainloop()
我应该做些什么改变?
您需要保留对图像的引用,否则它将被Python垃圾收集。 一个简单的更改就可以做到:
placeholder = []
def pop_up_window():
...
for infile in glob.glob(os.path.join(path, '*.jpg')):
image_count += 1
r, c = divmod(image_count-1, COLUMNS)
im = Image.open(infile)
img_part = ImageTk.PhotoImage(Image.open(infile).resize((100, 100), Image.ANTIALIAS))
placeholder.append(img_part)
image_in_canvas = container.create_image(r, c, image = img_part)
我还要指出, create_image
方法采用两个坐标作为args。 您当前正在创建它们,就像它们是网格一样,并且不会以您期望的对齐方式显示。
您的代码可以运行,但是几乎没有问题。 如果我忘了注意,我会全部或全部修复。
在函数中创建图像时,请始终为其创建引用,因为这里有很多图像,因此可以为container
创建一个列表。
要根据图像数量不断更新scrollregion
,请使用回调函数lambda e: scrollregion=container.bbox('all')
将“”绑定到container
lambda e: scrollregion=container.bbox('all')
。
这是我对pop_up_window
函数所做的更改。
...
path = "D:\\image_collection"
COLUMNS = 7
container.img_list = []
column = 0
row = 0
for infile in glob.glob(os.path.join(path, '*.jpg')):
if column >= COLUMNS:
column = 0
row += 1
im = Image.open(infile).resize((100, 100), Image.ANTIALIAS)
img = ImageTk.PhotoImage(im)
container.img_list.append(img)
container.create_image(column*100+10, row*100+10, image = img, anchor='nw')
column += 1
container.bind('<Configure>',lambda e:container.configure(scrollregion=container.bbox('all')))
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.