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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:10:27