Tkinter Canvas Flicker

时间:2013-06-05 21:14:53

标签: python tkinter python-imaging-library

我正在使用此代码(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画布应该是双缓冲的?我该怎么做才能避免这种情况?

2 个答案:

答案 0 :(得分:2)

所以我想出了问题 - 似乎你必须从tk运行的同一个线程创建你的tkimage或者发生坏事。感谢任何看过这个的人!

答案 1 :(得分: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)

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