tkinter截图程序调用root.withdraw()后部分设备无法隐藏主窗口
问题原因
这个问题是GUI操作的异步特性导致的。tkinter的root.withdraw()方法只会向系统发送窗口隐藏的指令,不会阻塞等待窗口完全从屏幕上渲染消失后才返回。不同设备的图形渲染性能不同,性能偏低的设备上,截图操作ImageGrab.grab()执行时窗口还没完全隐藏,就会把主窗口截入结果。
解决方案
- 第一步:在代码头部导入time模块
import time
- 第二步:修改
fullscreen函数,在隐藏窗口后增加强制事件处理和等待逻辑
def fullscreen(): root.withdraw() root.update() # 强制处理所有待执行的GUI事件,确保隐藏指令生效 time.sleep(0.2) # 等待窗口完全消失,可根据实际适配情况调整到0.1~0.3之间 roi_image = ImageGrab.grab(bbox=None) root.deiconify() save(roi_image)
- 第三步:修改
area_sel函数内的隐藏窗口逻辑,同样添加处理和等待
找到area_sel函数下的root.withdraw() # hide the root window行,在后面增加两行:
root.withdraw() # hide the root window root.update() time.sleep(0.2) image = ImageGrab.grab() # grab the fullscreen as select region background
如果修改后还有个别设备仍出现问题,可以适当把time.sleep的参数调到0.3,不要超过0.5避免影响操作体验。
内容的提问来源于stack exchange,提问作者Ly Nguyen
相关产品推荐
相关产品推荐

