我有一个简短的代码,允许人们使用tkinter自由绘制,当他们释放鼠标按钮时,会在自由绘制的两个端点之间自动创建一条线,从而形成一个闭合循环
这是我的密码:
from tkinter import *
from PIL import Image, ImageTk
class App(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.columnconfigure(0,weight=1)
self.rowconfigure(0,weight=1)
self.original = Image.open("C:/Users/elver/Pictures/living.jpg")
self.image = ImageTk.PhotoImage(self.original)
self.display = Canvas(self, bd=0, highlightthickness=0)
self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")
self.display.grid(row=0, sticky=W+E+N+S)
self.pack(fill=BOTH, expand=1)
self.bind("<Configure>", self.resize)
self.display.bind('<Button-1>', self.click)
self.display.bind('<B1-Motion>', self.move)
self.display.bind('<ButtonRelease-1>', self.release)
self.linelist = []
def resize(self, event):
size = (event.width, event.height)
resized = self.original.resize(size,Image.ANTIALIAS)
self.image = ImageTk.PhotoImage(resized)
self.display.delete("IMG")
self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")
def click(self, click_event):
global prev
prev = click_event
for x in range(0, len(self.linelist)-1):
self.display.delete(self.linelist[x])
self.linelist.clear()
self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")
def move(self, move_event):
global Canline
global prev
Canline=self.display.create_line(prev.x, prev.y, move_event.x, move_event.y, width=2)
self.linelist.append(Canline)
prev = move_event
#print(len(self.linelist))
def release(self, release_event):
global Canline
Canline=self.display.create_line(self.display.coords(self.linelist[1])[0], self.display.coords(self.linelist[1])[1], \
self.display.coords(self.linelist[len(self.linelist)-1])[0], self.display.coords(self.linelist[len(self.linelist)-1])[1], width=2)
root =Tk()
app = App(root)
app.mainloop()
我现在正试图填充闭合环所包围的区域,但我似乎找不到一种方法来填充。 我找不到一种方法来区分闭环内的区域和闭环外的区域
有没有一个简单的方法
您可以在列表
self.points
上保留点(event.x, event.y)
,并在release
中使用此列表绘制填充多边形:您甚至可以使用此列表中的第一个和最后一个元素来绘制结束线-因此您不需要从
self.display.coords(self.lines[0])
和self.display.coords(self.lines[-1])
获取坐标与许多其他更改一起工作的代码
编辑1:
在这个版本中,我在开始时使用
create_polygon
,之后使用coords()
更新这个多边形中的点。这样我就不需要带行的列表,也不需要使用create_line()
它在绘图过程中始终显示闭合线
coords()
需要平面列表[x1, y1, x2, y1, ...]
而不是[(x1, y1), (x2, y2), ...]
,因此我使用list.extend([x, y])
(list += [x, y]
)而不是list.append([x, y])
我使用
fill=""
在绘图期间具有透明多边形,在release()
中,我使用configitem()
将其更改为fill="red"
编辑2:
我意识到
create_line
可以同时获得两个以上的点并创建许多行,所以我在这个版本中使用它我向列表中添加点,并使用
coords()
更新现有直线中的点。这样,我只有一条线(有许多点-多边形没有闭合线),我不需要带线的列表编辑1的完整代码
编辑2的完整代码
相关问题 更多 >
编程相关推荐