画布中的PIL图像不可见

时间:2018-02-11 22:28:14

标签: python tkinter python-imaging-library

我尝试使用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)。

2 个答案:

答案 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()