加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

处理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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读