如何使用Gtk创建文档并打印?Python3 Gtk3打印取消问题解决
问题原因
- 核心缺失项是未给
Gtk.PrintOperation绑定必要的信号回调:GTK打印流程要求你至少实现draw-page信号的处理函数,用来完成每一页的内容绘制,没有这个回调时打印任务会被直接取消,不会抛出显式错误。 - 你手动提前创建的
Gtk.PrintContext和Pango布局是无效的:打印上下文需要和实际打印机参数、纸张设置匹配,由PrintOperation在流程启动后自动生成,不能提前手动初始化。 - 未声明打印总页数:如果没有在
begin-print信号中设置总页数,默认页数为0也会导致打印任务终止。
修正后的可运行代码
import gi import os gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango # 处理打印开始信号,设置总打印页数 def on_begin_print(operation, context, user_data): operation.set_n_pages(1) # 示例仅打印1页内容 # 处理单页绘制信号,完成实际内容绘制 def on_draw_page(operation, context, page_nr, user_data): # 从打印上下文获取Pango上下文 pango_context = context.create_pango_context() layout = Pango.Layout.new(pango_context) # 设置要打印的文本内容、字体 layout.set_text("Hello!", -1) layout.set_font_description(Pango.FontDescription("Sans 12")) # 获取Cairo上下文执行绘制 cr = context.get_cairo_context() cr.move_to(50, 50) # 设置文本绘制起始坐标(单位:点,1点=1/72英寸) Pango.cairo_show_layout(cr, layout) if __name__ == "__main__": parent = Gtk.Window() # 获取可用打印机 printers = os.popen("lpstat -e").read().strip().split("\n") if not printers or printers[0] == "": print("未找到可用打印机") exit(1) print("可用打印机:", printers) # 初始化打印配置 print_settings = Gtk.PrintSettings() print_settings.set_printer(printers[0]) print_settings.set_print_pages(Gtk.PrintPages.ALL) # 初始化打印操作 print_op = Gtk.PrintOperation.new() print_op.set_print_settings(print_settings) # 绑定必要的信号回调 print_op.connect("begin-print", on_begin_print, None) print_op.connect("draw-page", on_draw_page, None) # 执行打印 print("正在打印到:", printers[0]) res = print_op.run(Gtk.PrintOperationAction.PRINT, parent) print("打印结果:", res)
补充说明
- 如果不需要弹出打印确认窗口实现静默打印,可以在调用
run方法前添加print_op.set_allow_async(True),同时在打印配置中添加print_settings.set("silent", True, Gtk.PrintSettingsOrigin.LOCAL)。 - 坐标单位默认是打印点,你可以根据需要调整内容位置、字体大小、添加图片、表格等其他绘制逻辑,所有Cairo支持的绘制操作都可以在
on_draw_page函数中实现。
内容的提问来源于stack exchange,提问作者Sylvester is on codidact.com
相关产品推荐
相关产品推荐

