Python中的GUI性能(速度)



我目前正在用Python开发一个GUI,重点是函数,应该显示图像a覆盖图像B的正方形帧的擦除动画。

虽然我的代码片段中没有语法错误,但我遇到了几个性能问题。

首先,关于图像过渡的速度。如果我将第一个参数设置为"after"方法最小整数值为1,转换还是显得有点慢。

def wipe():
ImageA_Width, ImageA_Height = img.size
data_A_norm = asarray(img2)
data_B_norm = asarray(img)
def get_frame(frame_number):
frame = np.ones((ImageA_Width, ImageA_Height, 3))
for x in range(0, ImageA_Width):
for y in range(0, ImageA_Height):
if x < frame_number: 
frame[y,x] = data_A_norm[y,x]
else:
frame[y,x] = data_B_norm[y,x]
return frame

def show_frame(frame_number):
global shot, label3
if frame_number < ImageA_Width+1:
frame = get_frame(frame_number)
image_opened = Image.fromarray(frame.astype(np.uint8))
shot = ImageTk.PhotoImage(image_opened)
label3 = Label(window, image=shot)
label3.place(x=800, y=200)
label3.after(1, show_frame, frame_number+1)

show_frame(0)

我已经发现,如果图像存储在列表中,而不是在每次迭代中存储在变量中,则可以减少花在动画上的时间。

这种方法真的能提高我的表现吗?如果是这样,如何在Python中实现呢?

试试这个:

import numpy as np
from PIL import Image, ImageTk
def wipe():
# Load the images into numpy arrays
data_A_norm = np.asarray(img2)
data_B_norm = np.asarray(img)
# Get the size of the images
image_width, image_height = img.size
def get_frame(frame_number):
# Create an empty frame
frame = np.ones((image_width, image_height, 3), dtype=np.uint8)
# Use a mask to select which pixels should come from each image
mask = np.arange(image_width) < frame_number
frame[:,:,0] = data_A_norm[:,:,0] * mask + data_B_norm[:,:,0] * (1 - mask)
frame[:,:,1] = data_A_norm[:,:,1] * mask + data_B_norm[:,:,1] * (1 - mask)
frame[:,:,2] = data_A_norm[:,:,2] * mask + data_B_norm[:,:,2] * (1 - mask)
return frame

def show_frame(frame_number):
global shot, label3
if frame_number < image_width + 1:
# Get the next frame and display it
frame = get_frame(frame_number)
image_opened = Image.fromarray(frame)
shot = ImageTk.PhotoImage(image_opened)
label3 = Label(window, image=shot)
label3.place(x=800, y=200)
# Call this function again after a delay
label3.after(50, show_frame, frame_number + 1)

# Start the animation
show_frame(0)

这个版本的代码有一些变化:

get_frame函数使用numpy的矢量化操作来选择每个图像中的像素,这应该比使用嵌套的for循环要快得多。

show_frame函数以较慢的速率调用,使用50毫秒的延迟而不是1毫秒。这应该允许get_frame函数跟上帧速率。

image .fromarray函数用于将numpy数组转换回PIL图像,这应该比单独使用image和ImageTk库要快。

最新更新