我有以下代码用于在画布上绘图,然后将我的绘图保存为图像:
def paint(event):
global brush_size
global color
x1 = event.x - brush_size
x2 = event.x + brush_size
y1 = event.y - brush_size
y2 = event.y + brush_size
w.create_oval(x1, y1, x2, y2,
fill = color,
outline=color)
def getter(widget):
x = root.winfo_rootx() + widget.winfo_x()
y = root.winfo_rooty() + widget.winfo_y()
x1 = x + widget.winfo_width()
y1 = y + widget.winfo_height()
ImageGrab.grab().crop((x,y,x1,y1)).save("img1.jpg")
root = Tk()
root.title("Paint")
w = Canvas(root,
width=canvas_width,
height=canvas_height,
bg="white")
w.bind("<B1-Motion>", paint)
save_btn = Button(text="Save", width=10, command=getter(w))
w.grid(row=2, column=0,
columnspan=7,
padx=5, pady=5,
sticky=E+W+S+N)
w.columnconfigure(6, weight=1)
w.rowconfigure(2, weight=1)
save_btn.grid(row=0, column=1)
root.mainloop()
但是当我点击“保存”按钮时,我得到一个空的1x1px jpg文件。你能告诉我这有什么问题吗?
P.S。还有一些问题。当我快速绘制时,我没有得到连续的线条。我得到的点之间有间隙。我该如何解决这个问题?
答案 0 :(得分:2)
我不完全确定tkinter是如何工作的,所以这只是猜测,但看起来你绑定了getter(w)
(None
)的结果,而不是函数。您可以像lambda: getter(w)
一样解决此问题。对于您的其他问题,您可以记录以前的鼠标位置并在当前位置和之前位置之间画一条线。您还可以定义一个专门用于保存图像的函数,并将其用作命令。