注意:您实际上只需阅读清单并了解我想在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
如果有任何混淆或需要澄清的内容,请在评论部分告诉我。我心胸开阔,所以如果你对我的问题有深刻的理解,并对如何解决它有另一个想法,我很乐意听到它。
答案 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)
)