如何在python中仅使用Tk快速绘制位图?

这是一个问题。我想将特定的矢量场可视化为位图。对于表示本身来说没问题,所以我已经有了像[255,255,115]这样的RGB列表矩阵,但是我不知道如何在屏幕上绘制它。到目前为止,我制作了数千个彩色的1px矩形,但是这个工作太慢了。我相信有一个更好的方法来绘制位图。如何在python中仅使用Tk快速绘制位图?

回答:

未遂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)

回答:

有一个更快的纯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()方法来绘制一些颜色数据(一个字符串)创建一个矩形,在这种情况下,整个图像。这样你就不需要很昂贵的循环。

以上是 如何在python中仅使用Tk快速绘制位图? 的全部内容, 来源链接: utcz.com/qa/263423.html

回到顶部