如何在Python Tkinter程序中终止运行中的printer打印函数
代码问题分析
- 原代码没有可持久保存的终止状态标识,
button_status函数仅返回入参,无法存储用户是否点击了终止按钮的状态 - printer函数中
if(button_status==True)是将函数对象直接和布尔值比较,逻辑永远不成立,无法触发终止 - 耗时同步循环会阻塞Tkinter主线程的事件循环,导致界面点击事件无法被响应,终止操作无效
修复后可运行代码
from tkinter import * import time root = Tk() # 定义全局终止标识,初始为未终止 stop_flag = False # 终止按钮触发的函数,修改终止标识 def set_stop(): global stop_flag stop_flag = True # 打印函数 def printer(): global stop_flag # 每次运行前先重置终止标识,避免上次终止后无法再次运行 stop_flag = False for i in range(3): if stop_flag: print("打印已终止") break print(i) # 刷新界面事件,保证点击终止的信号能被捕获 root.update() # 模拟耗时打印任务,方便测试终止功能 time.sleep(1) button = Button(root, text="Stampa",height=2, width=6, command= printer, font=("TkDefaultFont",18),bg='white') button.place(x=630, y=680) button3 = Button(root, text="Termina",height=2, width=6, command= set_stop, font=("TkDefaultFont",18),bg='white') button3.place(x=780, y=680) root.state('zoomed') root.mainloop()
核心改动说明
- 新增全局变量
stop_flag作为终止状态的存储标识,初始值为False - Termina按钮绑定
set_stop函数,点击后直接修改stop_flag为True - printer函数每次执行前先重置
stop_flag,保证可以重复触发打印任务 - 循环内增加
root.update()主动刷新Tkinter事件队列,确保终止按钮的点击事件能被及时处理 - 增加了1秒延时模拟实际耗时任务,方便测试终止功能
内容的提问来源于stack exchange,提问作者Gebi
相关产品推荐
相关产品推荐

