处理python tkinter中的异常
发布时间:2020-12-20 12:29:55 所属栏目:Python 来源:网络整理
导读:我在 Python Tkinter中编写了一个应用程序.我最近注意到,对于其中一个操作,如果该操作失败,它有时会关闭(不会给出任何错误).我写了一个小程序来说明问题: – import osfrom Tkinter import *def copydir(): src = "D:axy" dest = "D:axz" os.re
我在
Python Tkinter中编写了一个应用程序.我最近注意到,对于其中一个操作,如果该操作失败,它有时会关闭(不会给出任何错误).我写了一个小程序来说明问题: –
import os from Tkinter import * def copydir(): src = "D:axy" dest = "D:axz" os.rename(src,dest) master = Tk() def callback(): global master master.after(1,callback) copydir() print "click!" b = Button(master,text="OK",command=copydir) b.pack() master.after(100,callback) mainloop() 要重现该问题,请在“ms命令提示符”中打开它将重命名的文件夹,以便重命名它将从Tkinter代码中引发异常. 我的原始代码是使用线程并且还在执行其他任务,因此我尝试使此测试脚本中的操作尽可能相似. 现在,如果我通过双击它来运行此代码,那么程序只需关闭而不会抛出任何错误.但是,如果我从控制台运行此脚本,那么异常消息将被转储到控制台上,至少我知道,出了点问题. 我可以通过在尝试重命名的代码中使用try / catch来修复此代码,但我也想告知用户这个失败.所以我只想知道在编写Tkinter应用程序时应该遵循哪些编码方法,我想知道: – 1)每当用户通过双击它运行它时,我可以让我的脚本转储一些文件堆栈跟踪.通过这个至少,我会知道一些错误并修复它. 2)我可以阻止tkinter应用程序退出此类错误并在某些TK对话框中抛出任何异常. 感谢帮助!! 解决方法
您可以按照说明
here覆盖Tkinter的
CallWrapper .必须使用命名的Tkinter导入而不是通配符导入才能这样做:
import Tkinter as tk import traceback class Catcher: def __init__(self,func,subst,widget): self.func = func self.subst = subst self.widget = widget def __call__(self,*args): try: if self.subst: args = apply(self.subst,args) return apply(self.func,args) except SystemExit,msg: raise SystemExit,msg except: traceback.print_exc(file=open('test.log','a')) # ... tk.CallWrapper = Catcher b = tk.Button(master,command=copydir) b.pack() master.mainloop() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |