Python/Tkinter开发条码打印工具如何实现停止打印功能
条码打印软件停止打印功能修复方案
问题根因
- 停止逻辑错误:原代码定义了控制变量
check_print但从未使用,stop_printing函数仅返回参数没有修改控制变量,循环中断判断写的是if(stop_printing==False),是将函数对象与布尔值比较,该判断永远不成立。 - 单线程阻塞:Tkinter是单线程运行的,打印函数运行时会阻塞主事件循环,点击终止按钮的事件无法被处理,控制变量永远不会被更新。
- 未清理打印队列:仅中断本地生成循环无法停止已经提交到打印机队列的任务,已提交的任务会继续打印完成。
修复步骤
- 修正启停控制逻辑:终止按钮点击时修改全局控制变量
check_print为False,打印循环中判断该变量决定是否中断。 - 避免界面阻塞:打印循环每次迭代调用
root.update()刷新事件队列,响应终止按钮点击操作。 - 新增打印队列清理逻辑:触发停止时调用Windows打印API清空当前打印机的待打印任务。
- 每次启动打印前重置控制变量为True,避免上次停止后无法再次启动打印。
核心修改代码
1. 停止函数修改
check_print = True def stop_printing(): global check_print check_print = False # 清空当前打印机队列 printer_name = win32print.GetDefaultPrinter() hprinter = win32print.OpenPrinter(printer_name) try: win32print.SetPrinter(hprinter, 0, None, win32print.PRINTER_CONTROL_PURGE) finally: win32print.ClosePrinter(hprinter)
2. 打印函数修改
在barcode_printer函数开头先重置控制变量,循环内新增事件刷新和停止判断:
def barcode_printer(): global check_print check_print = True if ((var3.get()=="Codice con numero")): iteration=entry6.get() startNumber=entry5.get() for i in range(int(iteration)): # 原有生成条码、打印的逻辑不变 # --------------------------- # 原有逻辑结束后新增以下内容 root.update() # 刷新界面事件响应 if not check_print: break elif (var3.get()=="Codice senza numero"): iteration=entry6.get() startNumber=entry5.get() for i in range(int(iteration)): # 原有生成条码、打印的逻辑不变 # --------------------------- # 原有逻辑结束后新增以下内容 root.update() # 刷新界面事件响应 if not check_print: break
3. 终止按钮绑定修改
button2 = Button(root, text="Termina",height=2, width=6,command=stop_printing, font=("TkDefaultFont",18),bg='white')
优化建议
- 打印完成后自动删除生成的临时条码图片,避免占用磁盘空间
- 可增加打印进度提示,提升使用体验
- 输入参数增加合法性校验,避免输入非数字内容导致程序崩溃
内容的提问来源于stack exchange,提问作者Gebi
相关产品推荐
相关产品推荐

