乐于分享
好东西不私藏

自动打印助手使用指南---附小程序下载链接

自动打印助手使用指南---附小程序下载链接

AI智能打印文件助手

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

📋 工具简介

自动打印助手是一款专业的文件打印工具,支持多种文件格式的批量打印,操作简单直观,为您的日常办公提供高效便捷的打印解决方案。

✨ 核心功能

  • 文件拖放:直接从资源管理器拖动文件到工具界面

  • 批量打印:一次性打印多个文件,节省时间

  • 打印机选择:自动检测系统打印机,支持快速切换

  • 实时日志:详细的打印状态和结果记录

  • 文件管理:支持删除单个文件和清空所有文件

🎯 支持的文件格式

  • 文档类:PDF、Word(.docx/.doc)、TXT、RTF、CSV

  • 图片类:JPG、JPEG、PNG、BMP、GIF

📖 使用步骤

1. 启动工具

双击 auto_printer.exe 文件启动自动打印助手。

2. 添加文件

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

3. 选择打印机

4. 点击打印

⚙️ 高级操作

删除单个文件

  1. 在文件列表中选中要删除的文件

  2. 点击"🗑️ 删除选中"按钮

清空所有文件

点击"🗑️ 清空所有"按钮,可快速清空文件列表。

📝 注意事项

  1. 文件大小:建议单个文件不超过100MB,以确保打印速度

  2. 文件数量:单次批量打印建议不超过50个文件

  3. 打印间隔:系统会自动为每个文件设置1秒的打印间隔,确保打印机正常工作

  4. 权限要求:需要有打印机的使用权限

  5. 系统要求: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 = root        self.root.title("简易打印工具 v2.0")        self.root.geometry("700x600")        self.root.resizable(TrueTrue)        self.root.configure(bg="#f5f7fa")        # 数据        self.file_list = []        self.printers = self.get_system_printers()        self.selected_printer = StringVar(value=self.printers[0if self.printers else "未找到打印机")        # 样式        self.style = ttk.Style()        self.style.theme_use('clam')        self.setup_styles()        # 创建UI        self.create_ui()        # 窗口关闭事件        self.root.protocol("WM_DELETE_WINDOW"self.on_closing)    # 获取系统打印机    def get_system_printers(self):        try:            return [p[2for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None1)]        except:            return ["未检测到打印机"]    # 设置样式    def setup_styles(self):        """设置界面样式"""        # 主按钮样式        self.style.configure(            "Primary.TButton",            font=("微软雅黑"10"bold"),            foreground="white",            background="#1976d2",            padding=(158)        )        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=(106)        )        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.printers        if 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 = 0        for 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 += 1        if 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(200lambdaself.file_listbox.config(bg=original_bg))        flash()    # 删除选中的单个文件    def delete_selected_file(self):        selected_idx = self.file_listbox.curselection()        if not selected_idx:            messagebox.showwarning("提示""请先选中要删除的文件")            return        idx = 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("提示""请先拖入需要打印的文件")            return        printer = 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 = 0        error_count = 0        self.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 += 1        self.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,可以动动可爱的小手分享给身边的好朋友!我们一起进步,每一个点赞关注分享都是小编前进的动力!


【往期回顾】

每个人都有一台免费的Linux虚拟机(Notebook)

ModelScope中的AIGC专区工作流的使用

WeChat给QClaw一个温暖的家,随时随地帮你高效干活

Linux破解root密码---精读篇(值的收藏)

一篇搞懂Linux中su与sudo---建议收藏