如何在图像上绘制 Tkinter canvas,PIL
How to draw on an image Tkinter canvas, PIL
我希望能够在 tkinter canvas PIL 显示的图像上绘图。我尝试了 google 搜索,但所有结果都是如何在没有 tkinter 的情况下绘制图像或如何显示不是我想要的图像。我也希望它像现场一样(移动鼠标时的颜色)。有什么办法可以做到这一点。如果 PIL 没有办法,tkinter 有没有办法。
回答
这个post的答案
如果 link 在这里不起作用是代码:
from tkinter import *
from tkinter import ttk
class Sketchpad(Canvas):
def __init__(self, parent, **kwargs):
super().__init__(parent, **kwargs)
self.bind("<Button-1>", self.save_posn)
self.bind("<B1-Motion>", self.add_line)
def save_posn(self, event):
self.lastx, self.lasty = event.x, event.y
def add_line(self, event):
self.create_line((self.lastx, self.lasty, event.x, event.y), width=20, capstyle='round')
self.save_posn(event)
root = Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
sketch = Sketchpad(root)
sketch.grid(column=0, row=0, sticky=(N, W, E, S))
root.mainloop()
我认为最好的方法是使用 tkinter
进行绘图,否则每次 PIL 更改图像时您都需要不断更新 canvas 小部件(可能是太慢了,会干扰“实时”绘图。
tkinter
Canvas
es 具有几种不同的矢量和文本绘图功能,您可以 draw/display 它们 在图像的顶部 也被它展示。这意味着如果您首先添加图像,则绘制的任何其他内容都会出现在该图像之上(如果它与图像重叠)。
下面是这样做的演示。请注意,我从 python-course.eu page: Canvas Widgets in Tkinter 中借用了一些代码和示例图像。它描述了 Canvas
小部件提供的绘图工具。
from PIL import Image, ImageTk
import tkinter as tk
from tkinter.constants import *
canvas_width, canvas_height = 300, 300
root = tk.Tk()
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()
img = ImageTk.PhotoImage(file='rocks.png')
canvas.create_image(20, 20, anchor=NW, image=img)
# Draw something on top of image.
points = [100, 140, 110, 110, 140, 100, 110, 90, 100, 60, 90, 90, 60, 100, 90, 110]
canvas.create_polygon(points, outline='green', fill='yellow', width=3)
root.mainloop()
这是代码使用的 rocks.png
图片。
结果截图:
我希望能够在 tkinter canvas PIL 显示的图像上绘图。我尝试了 google 搜索,但所有结果都是如何在没有 tkinter 的情况下绘制图像或如何显示不是我想要的图像。我也希望它像现场一样(移动鼠标时的颜色)。有什么办法可以做到这一点。如果 PIL 没有办法,tkinter 有没有办法。
回答
这个post的答案
from tkinter import *
from tkinter import ttk
class Sketchpad(Canvas):
def __init__(self, parent, **kwargs):
super().__init__(parent, **kwargs)
self.bind("<Button-1>", self.save_posn)
self.bind("<B1-Motion>", self.add_line)
def save_posn(self, event):
self.lastx, self.lasty = event.x, event.y
def add_line(self, event):
self.create_line((self.lastx, self.lasty, event.x, event.y), width=20, capstyle='round')
self.save_posn(event)
root = Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
sketch = Sketchpad(root)
sketch.grid(column=0, row=0, sticky=(N, W, E, S))
root.mainloop()
我认为最好的方法是使用 tkinter
进行绘图,否则每次 PIL 更改图像时您都需要不断更新 canvas 小部件(可能是太慢了,会干扰“实时”绘图。
tkinter
Canvas
es 具有几种不同的矢量和文本绘图功能,您可以 draw/display 它们 在图像的顶部 也被它展示。这意味着如果您首先添加图像,则绘制的任何其他内容都会出现在该图像之上(如果它与图像重叠)。
下面是这样做的演示。请注意,我从 python-course.eu page: Canvas Widgets in Tkinter 中借用了一些代码和示例图像。它描述了 Canvas
小部件提供的绘图工具。
from PIL import Image, ImageTk
import tkinter as tk
from tkinter.constants import *
canvas_width, canvas_height = 300, 300
root = tk.Tk()
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()
img = ImageTk.PhotoImage(file='rocks.png')
canvas.create_image(20, 20, anchor=NW, image=img)
# Draw something on top of image.
points = [100, 140, 110, 110, 140, 100, 110, 90, 100, 60, 90, 90, 60, 100, 90, 110]
canvas.create_polygon(points, outline='green', fill='yellow', width=3)
root.mainloop()
这是代码使用的 rocks.png
图片。
结果截图: