问题陈述
我用Python编写了一段代码,用户可以在此代码上使用tkinter画布。该程序能够获取应用程序的屏幕快照,但将画布内容保存到可查看的图像文件(如.jpg或.png)还没有正确完成。
截图
我已经试过了,而且还会期待
一些可能的互联网解决方案(包括堆栈溢出)已经尝试过,但不知怎么的,这个过程无法成功地完成。在画布上画完任何东西之后,保存的图像将只有一个点,不管它是在*.jpg还是*.png中。我需要整个画布的图像与所有的彩色图纸在它保存的图像文件。
对于任何参考,这是我的代码
from tkinter import Tk, Canvas, Button
from PIL import Image, ImageDraw
X = 0
Y = 0
app = Tk()
def set_xy(click):
global X, Y
X, Y = click.x, click.y
def draw_line(drag):
global X, Y
draw_panel.create_line((X, Y, drag.x, drag.y), fill="black", capstyle="round", smooth=True)
draw.line([(X, Y), (drag.x, drag.y)], fill="black", joint="curve")
X, Y = drag.x, drag.y
def save(event=None):
# ATTENTION: This is not working properly
image.save("image.png", "png")
# App's drawing panel
draw_panel = Canvas(app, background="white", cursor="dot")
draw_panel.place(x=0, relwidth=1.0, y=0, relheight=1.0)
# Invisible canvas for saving as an image later on
image = Image.new("RGB", (draw_panel.winfo_width(), draw_panel.winfo_height()), "white")
draw = ImageDraw.Draw(image)
# Mouse and Key bindings
draw_panel.bind('<Button-1>', set_xy)
draw_panel.bind('<B1-Motion>', draw_line)
app.bind('<s>', save) # press 's' to save the drawing as .png
app.mainloop()
补充资料:
任何解决办法都将受到高度赞赏,我将感激。
发布于 2022-12-02 06:16:06
这是个好主意,只少了一块。在第一次调用mainloop()
之前,将图像的大小设置为画布的大小。画布此时没有大小,因为窗口尚未启动。
在获得宽度和高度之前,需要强制进行更新。然后,它工作得很好:
# Invisible canvas for saving as an image later on
draw_panel.update()
image = Image.new("RGB", (draw_panel.winfo_width(), draw_panel.winfo_height()), "white")
draw = ImageDraw.Draw(image)
如果您在调用更新之前和之后打印draw_panel.winfo_width()
,您将看到我的意思。在update()
之前,宽度和高度都是1,之后,它们应该是200。
https://stackoverflow.com/questions/74591756
复制相似问题