在篇文章发表过后,有后台私信需要这种小工具的,然后我将关于AI智能识别语音的功能删除掉,因为需要在本地部署大模型,考虑到只是用来打印文件,这个功能没有必须,只保留了自动打印的功能,然后制作成小程序,简单方便,下边就将源码分享出来。

自动打印助手是一款专业的文件打印工具,支持多种文件格式的批量打印,操作简单直观,为您的日常办公提供高效便捷的打印解决方案。
✨ 核心功能
文件拖放:直接从资源管理器拖动文件到工具界面
批量打印:一次性打印多个文件,节省时间
打印机选择:自动检测系统打印机,支持快速切换
实时日志:详细的打印状态和结果记录
文件管理:支持删除单个文件和清空所有文件
🎯 支持的文件格式
文档类:PDF、Word(.docx/.doc)、TXT、RTF、CSV
图片类:JPG、JPEG、PNG、BMP、GIF
📖 使用步骤
1. 启动工具
双击 auto_printer.exe 文件启动自动打印助手。

直接从资源管理器拖动文件到文件列表区域

3. 选择打印机

4. 点击打印
⚙️ 高级操作删除单个文件
在文件列表中选中要删除的文件
点击"🗑️ 删除选中"按钮
清空所有文件
点击"🗑️ 清空所有"按钮,可快速清空文件列表。
📝 注意事项
文件大小:建议单个文件不超过100MB,以确保打印速度
文件数量:单次批量打印建议不超过50个文件
打印间隔:系统会自动为每个文件设置1秒的打印间隔,确保打印机正常工作
权限要求:需要有打印机的使用权限
系统要求:Windows 7及以上版本
源码分享:
import osimport tkinter as tkfrom tkinter import ttk, messagebox, scrolledtext, StringVar, Listbox, SINGLEfrom tkinterdnd2 import DND_FILES, TkinterDnDimport win32printimport win32apiimport timeimport threading# ==============================================# 自动打印工具 - 专业版# 功能:拖入文件、删除单个文件、选择打印机、批量打印、显示结果# ==============================================class SimplePrintTool:def __init__(self, root):self.root = rootself.root.title("简易打印工具 v2.0")self.root.geometry("700x600")self.root.resizable(True, True)self.root.configure(bg="#f5f7fa")# 数据self.file_list = []self.printers = self.get_system_printers()self.selected_printer = StringVar(value=self.printers[0] if self.printers else "未找到打印机")# 样式self.style = ttk.Style()self.style.theme_use('clam')self.setup_styles()# 创建UIself.create_ui()# 窗口关闭事件self.root.protocol("WM_DELETE_WINDOW", self.on_closing)# 获取系统打印机def get_system_printers(self):try:return [p[2] for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, 1)]except:return ["未检测到打印机"]# 设置样式def setup_styles(self):"""设置界面样式"""# 主按钮样式self.style.configure("Primary.TButton",font=("微软雅黑", 10, "bold"),foreground="white",background="#1976d2",padding=(15, 8))self.style.map("Primary.TButton",foreground=[('pressed', 'white'), ('active', 'white')],background=[('pressed', '#1565c0'), ('active', '#1976d2')])# 次要按钮样式self.style.configure("Secondary.TButton",font=("微软雅黑", 10),foreground="#2c3e50",background="#e0e0e0",padding=(10, 6))self.style.map("Secondary.TButton",foreground=[('pressed', '#2c3e50'), ('active', '#2c3e50')],background=[('pressed', '#bdbdbd'), ('active', '#e0e0e0')])# 组合框样式self.style.configure("TCombobox",font=("微软雅黑", 10),padding=5)# 界面布局def create_ui(self):# 顶部标题header = tk.Frame(self.root, bg="#1976d2", height=50)header.pack(fill=tk.X)header_content = tk.Frame(header, bg="#1976d2")header_content.pack(padx=20, pady=10, fill=tk.X)# 标题文本tk.Label(header_content, text="🖨️ 简易打印工具", font=("微软雅黑", 16, "bold"),bg="#1976d2", fg="white").pack(side=tk.LEFT)# 版本信息tk.Label(header_content, text="v2.0", font=("微软雅黑", 10),bg="#1976d2", fg="#e3f2fd").pack(side=tk.RIGHT)# 主卡片card = tk.Frame(self.root, bg="white", bd=0, relief="flat")card.pack(padx=25, pady=20, fill=tk.BOTH, expand=True)card.config(borderwidth=1, relief="solid", highlightbackground="#e0e6ed", highlightthickness=1)# 打印机选择区域printer_frame = tk.Frame(card, bg="white")printer_frame.pack(fill=tk.X, pady=15, padx=10)# 打印机选择标签tk.Label(printer_frame, text="选择打印机", font=("微软雅黑", 11, "bold"), bg="white", fg="#2c3e50").pack(anchor="w", pady=5)# 打印机选择组合框printer_frame_inner = tk.Frame(printer_frame, bg="white")printer_frame_inner.pack(fill=tk.X)self.printer_combo = ttk.Combobox(printer_frame_inner, textvariable=self.selected_printer, values=self.printers,font=("微软雅黑", 10), state="readonly", width=50)self.printer_combo.pack(side=tk.LEFT, fill=tk.X, expand=True, pady=5)# 刷新打印机按钮refresh_btn = ttk.Button(printer_frame_inner, text="🔄", command=self.refresh_printers,width=3, style="Secondary.TButton")refresh_btn.pack(side=tk.RIGHT, padx=10, pady=5)# 文件列表区域file_frame = tk.Frame(card, bg="white")file_frame.pack(fill=tk.BOTH, expand=True, pady=10, padx=10)# 文件列表标签tk.Label(file_frame, text="待打印文件", font=("微软雅黑", 11, "bold"), bg="white", fg="#2c3e50").pack(anchor="w", pady=5)# 文件列表容器list_container = tk.Frame(file_frame, bg="white", borderwidth=1, relief="solid", highlightbackground="#e0e6ed", highlightthickness=1)list_container.pack(fill=tk.BOTH, expand=True, pady=5)# 文件列表(支持删除选中项)# 添加滚动条scrollbar = ttk.Scrollbar(list_container, orient=tk.VERTICAL)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.file_listbox = Listbox(list_container,font=("微软雅黑", 10),height=10, # 增大高度selectmode=SINGLE,bd=0,relief="flat",bg="#fafbfc",selectbackground="#e3f2fd",selectforeground="#1976d2",yscrollcommand=scrollbar.set)self.file_listbox.pack(fill=tk.BOTH, expand=True, side=tk.LEFT)scrollbar.config(command=self.file_listbox.yview)self.file_listbox.insert(0, "👉 请将 PDF / Word / 图片 / TXT 文件拖到这里")# 绑定拖放self.file_listbox.drop_target_register(DND_FILES)self.file_listbox.dnd_bind('<<Drop>>', self.on_file_drop)# 绑定鼠标事件self.file_listbox.bind("<Enter>", self.on_listbox_enter)self.file_listbox.bind("<Leave>", self.on_listbox_leave)# 按钮行btn_frame = tk.Frame(card, bg="white")btn_frame.pack(fill=tk.X, pady=15, padx=10)# 左侧按钮组left_btns = tk.Frame(btn_frame, bg="white")left_btns.pack(side=tk.LEFT)# 删除选中文件按钮delete_btn = ttk.Button(left_btns, text="🗑️ 删除选中", command=self.delete_selected_file,style="Secondary.TButton")delete_btn.pack(side=tk.LEFT, padx=5)# 清空所有文件按钮clear_btn = ttk.Button(left_btns, text="🗑️ 清空所有", command=self.clear_all_files,style="Secondary.TButton")clear_btn.pack(side=tk.LEFT, padx=5)# 右侧按钮组right_btns = tk.Frame(btn_frame, bg="white")right_btns.pack(side=tk.RIGHT)# 开始打印按钮self.print_btn = ttk.Button(right_btns, text="🚀 开始打印", command=self.start_print,style="Primary.TButton")self.print_btn.pack(side=tk.RIGHT, padx=5)# 日志区域log_frame = tk.Frame(card, bg="white")log_frame.pack(fill=tk.BOTH, expand=True, pady=10, padx=10)# 日志标签tk.Label(log_frame, text="打印结果", font=("微软雅黑", 11, "bold"), bg="white", fg="#2c3e50").pack(anchor="w", pady=5)# 日志文本框log_container = tk.Frame(log_frame, bg="white", borderwidth=1, relief="solid", highlightbackground="#e0e6ed", highlightthickness=1)log_container.pack(fill=tk.BOTH, expand=True, pady=5)self.log_box = scrolledtext.ScrolledText(log_container,height=8, # 增大高度font=("微软雅黑", 9),bd=0,relief="flat",bg="#fafbfc",wrap=tk.WORD)self.log_box.pack(fill=tk.BOTH, expand=True)# 初始化日志self.log("欢迎使用简易打印工具 v2.0")self.log("请将文件拖放到文件列表中,然后点击开始打印")def on_listbox_enter(self, event):"""鼠标进入列表框"""self.file_listbox.config(bg="#f0f7ff")def on_listbox_leave(self, event):"""鼠标离开列表框"""self.file_listbox.config(bg="#fafbfc")def refresh_printers(self):"""刷新打印机列表"""self.printers = self.get_system_printers()self.printer_combo['values'] = self.printersif self.printers:self.selected_printer.set(self.printers[0])self.log("已刷新打印机列表")else:self.selected_printer.set("未检测到打印机")self.log("未检测到打印机")def clear_all_files(self):"""清空所有文件"""self.file_list = []self.file_listbox.delete(0, tk.END)self.file_listbox.insert(0, "👉 请将 PDF / Word / 图片 / TXT 文件拖到这里")self.log("已清空所有文件")def on_closing(self):"""窗口关闭事件"""self.root.destroy()# 拖入文件(追加,不覆盖)def on_file_drop(self, event):paths = event.data.replace("{", "").replace("}", "").split()allow_ext = [".pdf", ".docx", ".doc", ".txt", ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".csv", ".rtf"]# 清空提示文字if self.file_listbox.size() > 0 and self.file_listbox.get(0) == "👉 请将 PDF / Word / 图片 / TXT 文件拖到这里":self.file_listbox.delete(0)added_count = 0for path in paths:ext = os.path.splitext(path)[1].lower()if ext in allow_ext and path not in self.file_list:self.file_list.append(path)self.file_listbox.insert(tk.END, os.path.basename(path))added_count += 1if added_count > 0:self.log(f"已添加 {added_count} 个文件,当前共 {len(self.file_list)} 个")# 动画效果self.animate_listbox()else:self.log("没有添加新文件")def animate_listbox(self):"""列表框动画效果"""original_bg = self.file_listbox.cget("bg")def flash():self.file_listbox.config(bg="#e3f2fd")self.root.after(200, lambda: self.file_listbox.config(bg=original_bg))flash()# 删除选中的单个文件def delete_selected_file(self):selected_idx = self.file_listbox.curselection()if not selected_idx:messagebox.showwarning("提示", "请先选中要删除的文件")returnidx = selected_idx[0]del self.file_list[idx]self.file_listbox.delete(idx)self.log("已删除选中的文件")# 打印文件def start_print(self):if not self.file_list:messagebox.showwarning("提示", "请先拖入需要打印的文件")returnprinter = self.selected_printer.get()if printer == "未检测到打印机":messagebox.showerror("错误", "未找到可用打印机")return# 禁用打印按钮self.print_btn.config(state=tk.DISABLED)self.print_btn.config(text="打印中...")# 启动打印线程threading.Thread(target=self.print_files, args=(printer,), daemon=True).start()def print_files(self, printer):"""打印所有文件"""success_count = 0error_count = 0self.log(f"\n开始打印到:{printer}")self.log("=" * 50)for i, file_path in enumerate(self.file_list):try:file_name = os.path.basename(file_path)self.log(f"[{i+1}/{len(self.file_list)}] 正在打印:{file_name}")win32api.ShellExecute(0, "print", file_path, f'/d:"{printer}"', ".", 0)self.log(f"✅ 打印成功:{file_name}")success_count += 1# 打印间隔time.sleep(1)except Exception as e:self.log(f"❌ 打印失败:{os.path.basename(file_path)} - {str(e)}")error_count += 1self.log("=" * 50)self.log(f"打印完成:成功 {success_count} 个,失败 {error_count} 个")# 恢复打印按钮def reset_button():self.print_btn.config(state=tk.NORMAL)self.print_btn.config(text="🚀 开始打印")self.root.after(0, reset_button)# 显示结果def show_result():if error_count == 0:messagebox.showinfo("成功", f"全部 {success_count} 个文件打印成功!")else:messagebox.showwarning("完成", f"成功: {success_count} 个, 失败: {error_count} 个\n请查看日志了解详情")self.root.after(0, show_result)# 日志输出def log(self, msg):# 添加时间戳timestamp = time.strftime("%H:%M:%S")log_message = f"[{timestamp}] {msg}"self.log_box.config(state=tk.NORMAL)self.log_box.insert(tk.END, log_message + "\n")self.log_box.see(tk.END)# 限制日志行数line_count = int(self.log_box.index('end-1c').split('.')[0])if line_count > 100:self.log_box.delete('1.0', '20.0')self.log_box.config(state=tk.DISABLED)if __name__ == "__main__":root = TkinterDnD.Tk()app = SimplePrintTool(root)root.mainloop()
程序大小

可在Windows环境独立运行。
通过网盘分享的文件:auto_printer.exe
链接:
https://pan.baidu.com/s/148LB560E6r605JroHh7ZKw?pwd=QAZW 提取码: QAZW
【温馨提醒】
因家里有且仅有一台打印机,因此运行起来是没有问题的,加入遇到不能适配打印机型号的,有可能需要微调代码。
END
点赞
关
分享
宝子们如果觉得还OK,可以动动可爱的小手分享给身边的好朋友!我们一起进步,每一个点赞关注分享都是小编前进的动力!
【往期回顾】
夜雨聆风