You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:18:05