如何为Python通讯录代码添加字母排序与打印机打印功能?
通讯录排序与实体打印功能实现方案
一、Sort List功能整合
先确认你的通讯录是用列表套字典存储的(这是最常用的方式,比如contacts = [{"name": "张三", "phone": "123456"}, ...]),要是你用的是类实例,后面调整下排序键即可。
直接在菜单的Sort List分支里加入以下代码:
# 假设你的菜单选择用if/elif判断,找到Sort List对应的分支 elif choice == "Sort List": # 按姓名排序(中文环境系统默认支持拼音排序) contacts.sort(key=lambda x: x["name"]) # 若需按手机号排序,替换为: # contacts.sort(key=lambda x: x["phone"]) print("通讯录已按姓名排序完成!") # 可选:直接打印排序后的结果 for idx, contact in enumerate(contacts, 1): print(f"{idx}. 姓名: {contact['name']}, 电话: {contact['phone']}, 邮箱: {contact['email']}")
如果你的通讯录持久化存储在文件中,排序后记得重新写入文件,否则下次启动程序会恢复原顺序。
二、实体打印机打印功能实现
分不同系统场景给出可直接使用的代码:
Windows环境
先安装依赖:
pip install pywin32
编写打印函数并在菜单Print分支调用:
import win32print import win32api def print_contacts(contacts): if not contacts: print("通讯录为空,无内容可打印!") return # 获取默认打印机 printer_name = win32print.GetDefaultPrinter() hprinter = win32print.OpenPrinter(printer_name) try: # 初始化打印作业 win32print.StartDocPrinter(hprinter, 1, ("通讯录打印", None, "RAW")) win32print.StartPagePrinter(hprinter) # 拼接打印内容 content = "=== 通讯录列表 ===\n" for idx, contact in enumerate(contacts, 1): content += f"{idx}. 姓名: {contact['name']}\n电话: {contact['phone']}\n邮箱: {contact['email']}\n\n" content += "=== 打印完成 ===" # 发送到打印机(Windows用gbk编码适配中文) win32print.WritePrinter(hprinter, content.encode("gbk")) win32print.EndPagePrinter(hprinter) win32print.EndDocPrinter(hprinter) print("打印任务已发送至默认打印机!") finally: win32print.ClosePrinter(hprinter) # 菜单中的Print分支 elif choice == "Print": print_contacts(contacts)
Linux/macOS环境
无需额外安装依赖,直接调用系统lp命令(需提前配置好默认打印机):
import subprocess def print_contacts(contacts): if not contacts: print("通讯录为空,无内容可打印!") return # 拼接打印内容 content = "=== 通讯录列表 ===\n" for idx, contact in enumerate(contacts, 1): content += f"{idx}. 姓名: {contact['name']}\n电话: {contact['phone']}\n邮箱: {contact['email']}\n\n" content += "=== 打印完成 ===" # 调用lp命令打印 subprocess.run(["lp", "-"], input=content.encode("utf-8"), check=True) print("打印任务已发送至默认打印机!") # 菜单中的Print分支调用同上
美观排版打印(生成PDF后打印)
如果需要更规范的排版,可使用reportlab生成PDF再打印,先安装依赖:
pip install reportlab
代码示例:
from reportlab.pdfgen import canvas import subprocess import tempfile def print_contacts(contacts): if not contacts: print("通讯录为空,无内容可打印!") return # 创建临时PDF文件 with tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) as tmp: pdf_path = tmp.name # 生成PDF内容 c = canvas.Canvas(pdf_path) c.drawString(100, 800, "=== 通讯录列表 ===") y = 770 for idx, contact in enumerate(contacts, 1): c.drawString(100, y, f"{idx}. 姓名: {contact['name']}") c.drawString(100, y-20, f" 电话: {contact['phone']}") c.drawString(100, y-40, f" 邮箱: {contact['email']}") y -= 60 if y < 50: c.showPage() y = 800 c.drawString(100, y-20, "=== 打印完成 ===") c.save() # Linux/macOS执行以下命令 subprocess.run(["lp", pdf_path], check=True) # Windows替换为: # subprocess.run(["start", "/wait", "print", pdf_path], shell=True, check=True) print("打印任务已发送至默认打印机!")
注意事项
- 排序后若通讯录存储在文件中,务必重新写入文件,避免排序结果丢失
- 打印功能需先判断通讯录是否为空,防止触发报错
- 中文编码需匹配系统:Windows用gbk,Linux/macOS用utf-8
内容的提问来源于stack exchange,提问作者NASAAndr3w07
相关产品推荐
相关产品推荐

