如何在tkinter/Python 3.9应用中调用Windows标准打印对话框
解决方案
方案1:直接在现有Tkinter项目中集成PyQt5打印模块(无需单独编译exe)
你之前已经掌握了PyQt打印对话框的实现逻辑,直接在现有项目中集成PyQt打印模块是改造成本最低的方案,无需单独拆分脚本编译exe、也不需要跨进程调用:
- 先安装依赖:
pip install PyQt5 PyQt5-QtPrintSupport - 示例代码:
import sys from pathlib import Path from PyQt5.QtWidgets import QApplication from PyQt5.QtPrintSupport import QPrintDialog, QPrinter from PyQt5.QtGui import QTextDocument # 全局只需要初始化一次QApplication,放在项目启动位置即可 app = QApplication.instance() or QApplication(sys.argv) def print_file(file_path: str): printer = QPrinter() dialog = QPrintDialog(printer) if dialog.exec_() == QPrintDialog.Accepted: # 文本文件打印示例,HTML文件可替换为setHtml(),PDF打印可配套PyQt5的Pdf模块实现 doc = QTextDocument() with open(file_path, 'r', encoding='utf-8') as f: doc.setPlainText(f.read()) doc.print(printer) # 调用示例 print_file(r"C:\Users\me\Documents\TestFiles\print_test.text")
该方案完全支持用户自定义选择打印机、调整打印参数,不会额外添加页码、URL等冗余内容,适配绝大多数打印场景。
方案2:轻量系统原生调用方案(无第三方重型依赖)
如果不想引入PyQt的重型依赖,针对普通文本/Office文档场景可以直接调用系统内置工具唤起标准打印对话框:
import subprocess def system_print(file_path: str): # 纯文本文件用notepad唤起打印对话框 subprocess.run(["notepad.exe", "/p", file_path]) # 如果是Office文档可以对应替换为winword.exe、excel.exe等,参数逻辑一致
该方案不需要额外安装任何第三方库,完全使用系统原生能力,打印效果和手动打开文件点打印完全一致,没有冗余内容。
方案3:官方标准Win32打印对话框方案(你之前用的是mshtml.dll的变通实现,不属于官方标准方案)
如果你可以接受Win32API调用,官方标准的打印对话框接口不存在额外加页眉页脚的问题,完全符合需求:
- 安装依赖:
pip install pywin32 - 示例代码:
import win32ui def get_print_config(): print_dlg = win32ui.PrintDialog() if print_dlg.DoModal() == win32ui.IDOK: # 直接获取用户选择的打印机、打印份数、纸张大小等所有参数 return { "printer_name": print_dlg.GetDeviceName(), "copies": print_dlg.GetCopies(), "dc": print_dlg.GetDC() } return None
拿到打印参数后可以自行实现对应格式文件的打印逻辑,完全没有冗余内容。
内容的提问来源于stack exchange,提问作者rkinca
相关产品推荐
相关产品推荐

