Tkinter Canvas导出Postscript生成1x1图片问题求助
解决Tkinter Canvas导出1x1图片的问题
你的代码里有几个关键问题导致导出的图片是1x1尺寸:
Canvas内容未完成渲染就导出
Tkinter的组件渲染依赖主循环,你创建窗口后直接导出postscript,此时Canvas上的内容还没实际绘制出来。postscript方法未指定尺寸参数
默认情况下postscript()不会自动匹配Canvas的尺寸,需要明确指定导出的宽高参数。PhotoImage对象被垃圾回收
你创建的table和wp是局部变量,函数执行完会被Python回收,导致Canvas上的图片实际没显示,这也会影响导出结果。
修正后的代码
from tkinter import * from PIL import Image, ImageTk, EpsImagePlugin import io EpsImagePlugin.gs_windows_binary = r'gs\bin\gswin64c.exe' def interpret(c, p, x, y): path = f"images/{c}/{c[0]}{p}.png" win = Tk() win.geometry("1200x1200") canvas = Canvas(win, width=1200, height=1200) canvas.pack() # 保留PhotoImage引用,绑定到Canvas对象上避免被回收 table_img = Image.open("images/table.png") canvas.table = ImageTk.PhotoImage(table_img) canvas.create_image(0, 0, anchor=NW, image=canvas.table) piece_img = Image.open(path) canvas.piece = ImageTk.PhotoImage(piece_img) canvas.create_image((150 * x) - 150, (150 * y) - 150, anchor=NW, image=canvas.piece) # 强制窗口更新,确保Canvas内容渲染完成 win.update_idletasks() # 调用postscript时指定匹配Canvas的尺寸参数 postscript = canvas.postscript( colormode='color', width=1200, height=1200, pagewidth=1200, pageheight=1200 ) img = Image.open(io.BytesIO(postscript.encode('utf-8'))) # 如果需要保存为文件,添加这行 # img.save("chess_board.png", "PNG") img.show() # 关闭窗口 win.destroy() interpret('black', 'p', 4, 5)
关键修改点说明
- 保留PhotoImage引用:把
table和wp赋值给canvas.table和canvas.piece,让它们和Canvas对象绑定,避免被垃圾回收。 - 强制窗口更新:
win.update_idletasks()会让Tkinter立即处理所有待渲染的任务,确保Canvas上的内容都画好再导出。 - 指定postscript尺寸:通过
width、height、pagewidth、pageheight参数明确导出的尺寸,和Canvas的1200x1200保持一致。 - 添加窗口销毁:导出完成后调用
win.destroy()关闭临时窗口,避免残留窗口。
这样修改后,导出的图片就会是1200x1200的尺寸,和你的棋盘图片一致。
内容的提问来源于stack exchange,提问作者spookyss
相关产品推荐
相关产品推荐

