如何在来自 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])
我正在编写一个 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])