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

How not to get empty error message after running code from tkinter text widget

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

相关代码行如下(tx为文本小部件,currentfile为脚本名,subprocess导入为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)

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

if boobits[0]:

这样做比较安全

if boobits and boobits[0]:

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

虽然 {} 可以表示一个空字典,就像对问题的一些评论所暗示的那样,这也是 Tcl 表示列表中空元素的方式。 Tkinter 只是 Tcl/tk 解释器的包装器。

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

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