从tkinter文本小部件运行代码后如何不获取空错误消息

时间:2016-03-12 01:05:22

标签: python tkinter subprocess messagebox

我正在编写一个Python / Tkinter文本编辑器,除其他外,它将运行Tkinter脚本。如果它们无法正常工作,它将在消息框中显示生成的错误消息。我的问题是,当子进程窗口关闭时,它还会显示带有“{}”的空白错误消息。有没有办法获得真正的错误消息,而不是空白消息?

以下是相关的代码行(tx是文本小部件,currentfile是脚本名称,子进程是作为sub导入的):

def runcode(*arg):
    global tx, currentfile
    saveit = "Code must be saved before it can be run"
    if currentfile:
         if tx.edit_modified():
             file_save()
    else:
         messagebox.showinfo(message=saveit)
         file_saveas()
    # Catch error messages:
    p = sub.Popen(currentfile, stderr=sub.PIPE)
    errors = p.communicate()
    # Strip out word "None" from beginning:
    boobits = errors[1:]
    if boobits:
        messagebox.showerror(message=boobits)

2 个答案:

答案 0 :(得分:1)

{}是一个空字典,但(b'',)是一个包含空字符串的单元素元组。所以你的测试可以

if boobits[0]:

更安全

if boobits and boobits[0]:

如果boobits可能是一个空元组,但在这种情况下你可能不需要担心。

答案 1 :(得分:1)

虽然{}可以表示一个空字典,就像问题建议的一些评论一样,但它也是Tcl如何表示列表中的空元素。 Tkinter只是围绕Tcl / tk解释器的思考包装。

实际发生的是你将一个元组传递给它需要一个字符串的对话框。此列表由Tkinter转换为tcl列表,然后窗口小部件正在创建tcl列表的字符串表示形式,即{}(因为转换发生在Tcl解释器而不是python解释器中)

解决方案很简单:在将列表传递给对话框之前将其转换为字符串,或传入列表的第一个元素(例如:messagebox.showerror(message=boobits[0])