2009-10-17 38 views
4

這是一個問題。我想將特定的矢量場可視化爲位圖。對於表示本身來說沒問題,所以我已經有了像[255,255,115]這樣的RGB列表矩陣,但是我不知道如何在屏幕上繪製它。到目前爲止,我製作了數千個彩色的1px矩形,但是這個工作太慢了。我相信有一個更好的方法來繪製位圖。如何在python中僅使用Tk快速繪製位圖?

回答

12

未遂3 - 我發誓最後一...

我相信這是最快的純TK辦法做到這一點。在列表列表中生成10,000個RGB值,創建Tkinter.PhotoImage,然後將像素值放入其中。

import Tkinter, random 
class App: 
    def __init__(self, t): 
     self.i = Tkinter.PhotoImage(width=100,height=100) 
     colors = [[random.randint(0,255) for i in range(0,3)] for j in range(0,10000)] 
     row = 0; col = 0 
     for color in colors: 
      self.i.put('#%02x%02x%02x' % tuple(color),(row,col)) 
      col += 1 
      if col == 100: 
       row +=1; col = 0   
     c = Tkinter.Canvas(t, width=100, height=100); c.pack() 
     c.create_image(0, 0, image = self.i, anchor=Tkinter.NW) 

t = Tkinter.Tk() 
a = App(t)  
t.mainloop() 

ATTEMPT 1 - 利用create_rectangle方法

我寫這作爲測試。在2.67千兆赫我的英特爾酷睿2雙核處理器,它會吸取0.6秒,想想5000像素,包括產生隨機我RGB值時間:

from Tkinter import * 
import random 

def RGBs(num): 
# random list of list RGBs 
return [[random.randint(0,255) for i in range(0,3)] for j in range(0,num)] 

def rgb2Hex(rgb_tuple): 
    return '#%02x%02x%02x' % tuple(rgb_tuple) 

def drawGrid(w,colors): 
col = 0; row = 0 
colors = [rgb2Hex(color) for color in colors] 
for color in colors: 
    w.create_rectangle(col, row, col+1, row+1, fill=color, outline=color) 
    col+=1 
    if col == 100: 
    row += 1; col = 0 

root = Tk() 
w = Canvas(root) 
w.grid() 
colors = RGBs(5000) 
drawGrid(w,colors) 
root.mainloop() 

未遂2 - 使用PIL

我知道你只說TK,但PIL使這真的很容易和快速。

def rgb2Hex(rgb_tuple): 
    return '#%02x%02x%02x' % tuple(rgb_tuple) 

num = 10000 #10,000 pixels in 100,100 image 
colors = [[random.randint(0,255) for i in range(0,3)] for j in range(0,num)] 
colors = [rgb2Hex(color) for color in colors] 
im = Image.fromstring('RGB',(100,100),"".join(colors)) 
tkpi = ImageTk.PhotoImage(im) 
## add to a label or whatever... 
label_image = Tkinter.Label(root, image=tkpi) 
+3

嘗試3大概可以顯着加快。建立一個像素陣列並做一個「put」而不是爲每個像素做一個「put」通常要快得多。 –

4

有一個更快的純Tkinter的方法:

import Tkinter, random 
import random 

class App: 
    def __init__(self, t): 
     self.width = 320 
     self.height = 200 
     self.i = Tkinter.PhotoImage(width=self.width,height=self.height) 
     rgb_colors = ([random.randint(0,255) for i in range(0,3)] for j in range(0,self.width*self.height)) 
     pixels=" ".join(("{"+" ".join(('#%02x%02x%02x' % 
      tuple(next(rgb_colors)) for i in range(self.width)))+"}" for j in range(self.height))) 
     self.i.put(pixels,(0,0,self.width-1,self.height-1)) 
     c = Tkinter.Canvas(t, width=self.width, height=self.height); c.pack() 
     c.create_image(0, 0, image = self.i, anchor=Tkinter.NW) 

t = Tkinter.Tk() 
a = App(t)  
t.mainloop() 

您可以使用put()方法來繪製一些顏色數據(一個字符串)創建一個矩形,在這種情況下,整個圖像。這樣你就不需要很昂貴的循環。