我尝试使用PIL创建一个Image。我想用t" create_image"在tkinter画布中显示图像。方法。但画布上没有图像。它看起来很空白:
self.image = Image.new("RGBA", (w, h), "white")
pixels = self.image.load()
for x in range(w):
for y in range(h):
pixels[x, y] = area.get_color(x, y)
photo = ImageTk.PhotoImage(self.image)
self.canvas.create_image(0, 0, image=photo)
self.canvas.pack(fill=tk.BOTH, expand=tk.TRUE)
方法" area.get_color(x,y)"返回一个4元组(r,g,b,alpha)。
答案 0 :(得分:2)
嗯,很少:
首先,python有这个奇怪的垃圾收集问题与tkinter图像,为了真正将图像传递到你的画布,你需要首先锚定,否则它将被传递到画布时擦除。
这是我向其他人example学习后所做的事情:
window.image = create_image(WIDTH, HEIGHT)
将其锚定到Tk()
后,只要Tk()
存在,就不应再收集和删除。
第二个问题是您的图片位置,您可能希望将其放置在画布的中心而不是它的角落:
canvas.create_image(WIDTH//2, HEIGHT//2, image=window.image)
最后你的程序看起来像这样:
window = tk.Tk()
canvas = tk.Canvas(window, width=WIDTH, height=HEIGHT)
window.image = create_image(WIDTH, HEIGHT)
canvas.create_image(WIDTH//2, HEIGHT//2, image=window.image)
canvas.pack(fill=tk.BOTH, expand=tk.TRUE)
window.mainloop()
BTW半径为10的圆圈在640 x 480的画布中太小了,您可能希望将此数字增加到100左右。
if x**2 + y**2 < 10000:
喜欢那个^
答案 1 :(得分:0)
我只发布了学生项目代码的相关部分。他们试图创建一个显示分形的tkinter应用程序。但他们应该这样做 绝对的(疯狂的)面向对象的方式。之后,它应该以更快的速度完成。
所有其他代码都正常(所有测试都可以),只有PIL部分...
好的,我创建了一小段代码来展示学生的想法。但是这段代码并没有像预期的那样显示出一个黑色的圆圈。画布仍然是空的:
import tkinter as tk
from PIL import Image, ImageTk
WHITE = (255, 255, 255, 255)
BLACK = (0, 0, 0, 255)
WIDTH = 640
HEIGHT = 480
def get_color(x, y):
if x**2 + y**2 < 100:
return BLACK
else:
return WHITE
def create_image(w, h):
image = Image.new("RGBA", (w, h), "white")
pixels = image.load()
for x in range(w):
for y in range(h):
pixels[x, y] = get_color(x, y)
return ImageTk.PhotoImage(image)
window = tk.Tk()
canvas = tk.Canvas(window, width=WIDTH, height=HEIGHT)
canvas.create_image(0, 0, image=create_image(WIDTH, HEIGHT))
canvas.pack(fill=tk.BOTH, expand=tk.TRUE)
window.mainloop()