2013-06-05 164 views
2

我画小黑白视频帧以使用此代码一个Tkinter的画布(为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

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

+1

您应该将自己的答案标记为已接受的答案,以便后面的任何人都能清楚地看到解决方案。 –

+1

我会当我可以 - StackOverflow授权24小时等待期。 –

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) 

另外,如果你不使用画布为别的,你可能要考虑使用一个标签窗口小部件,而不是画布和图像资料。

+0

嗯...我已经改变了我的代码使用itemconfig,这似乎更正确。但是,图像仍然闪烁。 –

+0

我也尝试过使用标签,这个标签稍微简单一些,它*仍然*闪烁 –