我正在尝试在我的Python脚本中为ttk.Treeview
实例添加一个项目,以构建基本UI。插入代码如下所示:
tree.insert(my_id,
'end',
todo_id,
text="Line " + str(line_num),
values=(str(todo_text), owner), # I have 2 cols, 'text' and 'owner'
tags=['#todo_entry'])
我发现在名为“text”的列中设置字符串todo_text
时,Tkinter在遇到特定字符串时会抛出错误:
_tkinter.TclError:列表中无法匹配的大括号
并且我唯一可以想到的原因是,所讨论的字符串包含一个大括号。这是它打破的字符串:
'// static class Properties { // TODO, temp class'
无论我是否使用todo_text
或str(todo_text)
。
文本字符串是否以某种方式解析?我错过了什么?
答案 0 :(得分:3)
在它的核心,Tkinter是Tcl解释器的包装器。对于Tcl,花括号是特殊的,除非它们被转义。大括号是创建Tcl列表的最常用方法。如果你看到unmatched open brace in list
,这是一个与你有不平衡大括号有关的Tcl错误。
这看起来像是一个Tkinter错误 - tkinter包装器在将数据传递给Tcl解释器之前错误地引用了数据。当你在花括号前面放一个反斜杠时,现在它变成了一个有效的Tcl字符串,这就是你不再看到错误的原因。
这已在python错误跟踪器上报告为问题#15861
答案 1 :(得分:2)
Tkinter位于Tcl之上,它使用大括号作为一种引用。
看起来Tkinter引用了带有大括号的字符串,但没有转义任何碰巧出现在字符串本身的字符串。