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
相关产品推荐
相关产品推荐

