【发布时间】:2021-09-26 21:21:58
【问题描述】:
我正在尝试制作一个程序来一次显示一个图像(.png 扩展名),但给用户一个按钮来更改图片。
我所做的是:
- 借助 Pillow 模块从我的目录中读取图像
- 将其附加到列表中
- 通过一个按钮,我可以增加或减少列表的索引。
(请注意,我必须阅读大约 600 张图像。)
代码如下:
import os
from tkinter import *
from PIL import ImageTk,Image
import threading,time
#Define the tkinter instance
x=0
win= Tk()
dir_path= os.path.dirname(os.path.realpath(__file__))
print(dir_path)
l1=[]
#Define the size of the tkinter frame
win.geometry("700x400")
def start():
threading.Thread(target=bg).start()
win.after(5000,threading.Thread(target=fg).start())
#Define the function to start the thread
def bg():
print("bg")
for i in range(1,604):
a=Image.open(f"{dir_path}\\{i}.png")
a=a.resize((500,700), Image.ANTIALIAS)
b=ImageTk.PhotoImage(a)
l1.append(b)
print(b)
print(len(l1))
def fg():
def add():
global x
x+=1
img2=l1[x]
d.configure(image=img2)
d.image = img2
d.update()
global d
d=Label(win,image=l1[x])
d.pack()
Button(win,text="add",command=add).place(x=0,y=0)
label= Label(win)
label.pack(pady=20)
#Create button
b1= Button(win,text= "Start", command=start)
b1.pack(pady=20)
win.mainloop()
但问题是 Tkinter 变得死机和滞后,以至于 gui 无法运行。
所以我的问题是,
如何修复 Tkinter dead Frezzes 以及是否有任何方法可以尽可能快地读取图像?
任何帮助将不胜感激,
提前致谢
【问题讨论】:
-
win.after(5000,threading.Thread(target=fg).start())应该改为win.after(5000,threading.Thread(target=fg).start)。我也无法重现冻结问题。最好在点击后禁用/删除Start按钮。 -
-
我已经在评论中说“我无法重现冻结问题”。
-
哦,抱歉没看到
-
您不应该从其他线程调用
tkinter函数。它可能导致tkinter崩溃,甚至没有给您回溯。
标签: python tkinter directory python-imaging-library