2013-06-05 90 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

我也嘗試過使用標籤,這個標籤稍微簡單一些,它*仍然*閃爍 –