4

我正在使用此代码(在 10Hz)将小的黑白视频帧绘制到 Tkinter 画布上

self.image.buf = bytearray(header.width * header.height);
self.image.buf[:] = image
self.image.im = Image.frombuffer("L", (header.width, header.height), self.image.buf).resize((320, 240)).transpose(Image.ROTATE_180)
self.image.tkimage = ImageTk.PhotoImage(self.image.im)
if (self.image.id): self.image.delete(self.image.id);
self.image.id = self.image.create_image((0, 0), image=self.image.tkimage, anchor=NW)

每次绘制帧时,小部件都会闪烁。Tk 画布不应该是双缓冲的吗?我该怎么做才能避免这种情况?

4

2 回答 2

4

所以我发现了这个问题——看来你必须从 tk 正在运行的同一个线程创建你的 tkimage,否则会发生坏事。感谢任何看过这个的人!

于 2013-06-06T18:21:28.163 回答
1

我认为您的问题中没有足够的细节来确定问题所在。可以在不闪烁的情况下交换图像,并且您的代码看起来不太异常,因此您的代码中可能存在其他导致问题的东西。

这是要尝试的一件事:与其在每次迭代中删除和重新创建画布项,不如尝试使用您重新配置的一个画布项以使用该itemconfig方法使用新图像。

例如:

if self.image.id is None:
    self.image.id = self.image.create_image(...)
else:
    self.image.itemconfig(self.image.id, image=self.image.tkimage)

此外,如果您没有将画布用于其他任何事情,您可能需要考虑使用标签小部件而不是画布和图像项。

于 2013-06-06T01:27:39.000 回答