在tkinter上绘制像素的最快方法

时间:2018-03-01 02:04:12

标签: python tkinter 3d tkinter-canvas

注意:您实际上只需阅读清单并了解我想在Tkinter中执行此操作,其余信息仅供参考

完整的代码在这里:https://gist.github.com/SnugBug/1cc5ea67d11487d69aae8549107372ef

我需要能够操纵像素。目标是能够:

  • 控制首先绘制哪些像素

  • 更改每个像素的颜色和位置

  • 整体更新所有内容,以便在像素发生变化时显示更改

  • 整体清除所有内容

问题是,在tkinter中检查此列表的最快方法是什么?我尝试使用PIL创建图像,然后将其加载到tkinter,但我无法更新图像或清除它。我尝试的另一件事是使用tkinter的PhotoImage类,如下所示:

#The function definitions are in the GIST.
#This snippet should be enough information to understand the problem, however.
for i in range(0,3600):
    rot = [0,i,0]
    Tx,Ty,Tz,Zm = [0,0,200,200]
    x,y,z = [10,10,10]
    for m,n in itertools.product(range(-50,50,2),range(-50,50,2)):
        x,y,z = rotate([m,n,0],rot)
        img.put("#ffffff", (int(WIDTH/2 + ((x+Tx)*Zm/(z+Tz))), int(HEIGHT/2 - ((y+Ty)*Zm/(z+Tz)))))
    canvas.update()
    img.blank()
#the confusing math in the `img.put` call is just 3D math

这种方式非常慢。我尝试的下一个方法甚至更慢。它画了这样一条线: canvas.create_line(x,y,x+1,y+1, ...) 这会创建一条长度为1的线,显示一个像素。这非常缓慢。

如果单独的图像方法最快,您可以在答案中包含一个工作代码段吗?我无法弄清楚单独的图像方法。我安装了PIL,这就是我用它来尝试它。我丢失了python文件,所以我不能包含我用来尝试单独图像方法的代码。

我的意思是单独的图像方法:使用PIL创建图像,使用PIL在其上绘图,然后在tkinter屏幕上显示。但这并不符合清单上的所有内容(根据我的理解)。

如果单独的图像方法不是最快的,请告诉我一种方法,我可以用其他方式检查清单中的所有内容。我有几个问题,我寻求帮助和一些网站。他们在

之下

Why is Photoimage put slow? 任何这些答案对我都不起作用,因为它只会创建正方形。我需要能够做任何形状。

python tkinter: how to work with pixels? 这个答案不起作用,因为它太慢了。

How to load .bmp file into BitmapImage class Tkinter python这可能会有所帮助

http://zetcode.com/gui/tkinter/drawing/这些方法都不起作用,因为我无法操纵每个像素的绘制顺序,以及每个像素的颜色。如果您熟悉3D术语,我需要将其用于Z-Buffer

如果有任何混淆或需要澄清的内容,请在评论部分告诉我。我心胸开阔,所以如果你对我的问题有深刻的理解,并对如何解决它有另一个想法,我很乐意听到它。

1 个答案:

答案 0 :(得分:0)

如果您使用的是 Windows,那么将图像放在框架上的最快方法是通过 ImageWin。首先从PIL图像转换为tkphotoimage的tkinter过程非常缓慢。

from PIL import Image, ImageWin
from win32gui import GetDC
from tkinter import Tk

root = Tk()
im = Image.open(<file path>)
ImageWin.Dib(im).draw(
        GetDC(ImageWin.HWND(root.winfo_id())), 
        (0,0,100,100)
)