这是我的尝试,从另一篇文章修改而来,创建一个 minimal 循环,在其中创建一个 numpy 数组并显示它。 (为了方便起见,我有一个“开始”按钮。)
它工作得很好,但有一个例外——它全速运行,无论我在 self.after 的第一个参数中输入什么延迟(在下面的示例中为 1000。更改此参数没有明显的效果。)
我错过了什么? (我正在运行 python 3.8.3。哦,这显然是一个非常旧的版本。该死。我会去更新,以防万一与问题相关。)
from PIL import ImageTk
import numpy as np
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self, width = 1200, height=1200)
self.canvas.pack()
tk.Button(self, text="Start", command=self.start_animation).pack()
def start_animation(self):
self.canvas.delete('all')
# generate a random test frame
im = np.random.randint(0, 255, (1024,1024,3), dtype="uint8")
im1 = Image.fromarray(im, 'RGB')
im2 = ImageTk.PhotoImage(im1)
self.canvas.create_image(600, 600, image=im2)
self.update()
self.after(1000, self.start_animation())
if __name__ == '__main__':
App().mainloop()
这里有几点
command
的选项 tk.Button
的值应该是一个函数,而不是该函数的结果。tk.Button(self, text="Start", command=self.start_animation)
ImageTk.PhotoImage
对象应该有一个参考,否则它不会显示在您的画布上。self.im2 = ImageTk.PhotoImage(im1)
Image
不是从 Pillow
进口的。示例代码
from PIL import Image, ImageTk
import numpy as np
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self, width = 200, height=200)
self.canvas.pack()
tk.Button(self, text="Start", command=self.start_animation).pack()
def start_animation(self):
self.canvas.delete('all')
# generate a random test frame
im = np.random.randint(0, 255, (200, 200, 3), dtype="uint8")
im1 = Image.fromarray(im, 'RGB')
self.im2 = ImageTk.PhotoImage(im1)
self.canvas.create_image(0, 0, image=self.im2, anchor=tk.NW)
self.update()
self.after(1000, self.start_animation)
if __name__ == '__main__':
App().mainloop()