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

Python调用本地打印机失败:无法识别指定打印机的技术求助

问题:Python无法连接本地标签打印机

我在使用Python调用名为“Label Printer”的本地打印机时遇到问题,完全无法排查代码失效原因。该打印机在非Python环境下可正常连接使用,但Python代码无法找到它。是否需要调整打印机定义方式,或是有其他连接方法?恳请提供Python连接打印机的相关技术建议。


完整GUI打印代码

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import win32print
import tkinter as tk

# Authenticate and open the Google Sheet
creds = ServiceAccountCredentials.from_json_keyfile_name('creds.json', [
                                                         'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'])
client = gspread.authorize(creds)
sheet = client.open_by_key(
    '1eRO-30eIZamB5sjBp-Mz2QMKCfGxV037MQO8nS7G7AI').worksheet('Label')


class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title('Porter\'s Label Printer')
        self.master.geometry('400x300')  # Set the window size
        self.counter = 0
        self.total_labels = int(sheet.acell('F2').value)
        self.create_widgets()
        self.update_counter()

    def create_widgets(self):
        self.print_button = tk.Button(self.master, text='Print Labels', command=self.print_labels, font=(
            'Arial', 24), bg='lightblue', padx=40, pady=40)
        self.print_button.pack(fill=tk.BOTH, expand=True)

        self.counter_label = tk.Label(self.master, text='0 of {} labels printed'.format(
            self.total_labels), font=('Arial', 18))
        self.counter_label.pack(pady=20)

        self.refresh_button = tk.Button(self.master, text='Refresh', command=self.refresh_labels, font=(
            'Arial', 14), bg='lightgrey', padx=20, pady=10)
        self.refresh_button.pack(pady=20)

    def print_labels(self):
        for i in range(self.total_labels):
            win32print.SetDefaultPrinter('Label Printer')
            print_label_data = sheet.cell(sheet.find(
                'Label').row, sheet.find('Label').col).value
            print(print_label_data)
            self.counter += 1
            self.update_counter()

    def refresh_labels(self):
        try:
            self.total_labels = int(sheet.acell('F2').value)
            self.counter = 0
            self.update_counter()
            self.print_button.config(state=tk.NORMAL)
            self.counter_label.config(fg='black')
        except ValueError:
            print('Error: could not convert F2 value to an integer')
            self.total_labels = 0
            self.counter_label.config(
                text='Invalid number of labels!', fg='red')
            self.print_button.config(state=tk.DISABLED)

    def update_counter(self):
        if self.counter == self.total_labels:
            self.counter_label.config(
                text='All documents printed!', fg='green')
            self.print_button.config(state=tk.DISABLED)
        else:
            self.counter_label.config(text='{} of {} labels printed'.format(
                self.counter, self.total_labels))


# Authenticate and open the Google Sheet
creds = ServiceAccountCredentials.from_json_keyfile_name('creds.json', [
                                                         'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'])
client = gspread.authorize(creds)
sheet = client.open_by_key(
    '1eRO-30eIZamB5sjBp-Mz2QMKCfGxV037MQO8nS7G7AI').worksheet('Label')

# Create a GUI window
root = tk.Tk()
app = App(master=root)

# Run the GUI
app.mainloop()

基础IP连接测试代码

import win32print

# Set the IP address of the printer
printer_ip = '192.168.1.10'

# Create a printer handle
printer_handle = win32print.OpenPrinter(fr"\\{printer_ip}\ZDesigner GK420d")

# Get the default printer settings
default_printer_settings = win32print.GetPrinter(printer_handle, 2)

# Start a print job
job_info = ('Test Print', None, default_printer_settings, None)
job_id = win32print.StartDocPrinter(printer_handle, 1, job_info)

# Send the test page to the printer
win32print.StartPagePrinter(printer_handle)
win32print.WritePrinter(printer_handle, b'test')
win32print.EndPagePrinter(printer_handle)

# End the print job
win32print.EndDocPrinter(printer_handle)

# Close the printer handle
win32print.ClosePrinter(printer_handle)

排查情况

  • 尝试通过IP连接打印机但无法找到
  • 命令提示符获取的IP列表在打印机插拔前后无变化,推测系统未识别该打印机
  • 无法从打印机属性的端口标签页获取其IP

技术建议

1. 确认系统中打印机的准确名称

先运行以下代码列出系统内所有可用打印机,确保你使用的名称和系统显示的完全一致:

import win32print
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
for printer in printers:
    print(printer[2])  # 输出打印机的准确名称

找到目标打印机后,直接用输出的名称替换代码中的打印机名称。

2. 检查连接权限与方式

  • 如果是USB连接:以管理员权限运行Python脚本,部分USB打印机需要高权限才能被程序访问
  • 如果是网络连接:通过系统打印机设置确认打印机的共享名称和真实IP,不要自行猜测参数

3. 修正GUI代码的打印逻辑

原代码仅设置了默认打印机,并未向打印机发送实际打印任务,仅在控制台输出数据。补充完整打印逻辑:

def print_labels(self):
    printer_name = "Label Printer"  # 替换为EnumPrinters获取的准确名称
    hPrinter = win32print.OpenPrinter(printer_name)
    try:
        # 初始化打印任务
        job_info = ("Label Print Job", None, None, None)
        job_id = win32print.StartDocPrinter(hPrinter, 1, job_info)
        win32print.StartPagePrinter(hPrinter)
        
        for i in range(self.total_labels):
            print_label_data = sheet.cell(sheet.find('Label').row, sheet.find('Label').col).value
            # 发送打印数据(标签打印机可能需要特定编码或指令格式,比如ZPL)
            win32print.WritePrinter(hPrinter, print_label_data.encode('utf-8'))
            self.counter += 1
            self.update_counter()
        
        win32print.EndPagePrinter(hPrinter)
        win32print.EndDocPrinter(hPrinter)
    except Exception as e:
        print(f"Print error: {e}")
    finally:
        win32print.ClosePrinter(hPrinter)

4. 标签打印机特殊处理

如果是Zebra等热敏标签打印机,通常需要发送ZPL指令而非普通文本。需确认打印机支持的指令格式,将数据转换为对应格式后再发送。

5. 添加异常捕获调试

在打印机相关操作中加入异常捕获,明确错误原因:

try:
    win32print.SetDefaultPrinter('Label Printer')
except Exception as e:
    print(f"Failed to set default printer: {e}")

内容的提问来源于stack exchange,提问作者Anthony Madle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:09:59