Python tkinter treeview行显示值与下划线不符
我有一个发票相关数据的树状视图显示。发票标识符有下划线。我注意到下划线在GUI中正确显示,但是从树行数据获得的发票编号值忽略了下划线。 在将数据插入完整的应用程序以处理该问题之前,我目前正在进行-for_u的替换 我使用treeview或检索用户选择的行数据的方式是导致问题的原因吗?或者,对于GUI显示和具有下划线字符的检索值之间的差异,是否有其他解释 我正在使用python 3.6和tkinter 8.6 这里有一个例子 多谢各位Python tkinter treeview行显示值与下划线不符,python,tkinter,Python,Tkinter,我有一个发票相关数据的树状视图显示。发票标识符有下划线。我注意到下划线在GUI中正确显示,但是从树行数据获得的发票编号值忽略了下划线。 在将数据插入完整的应用程序以处理该问题之前,我目前正在进行-for_u的替换 我使用treeview或检索用户选择的行数据的方式是导致问题的原因吗?或者,对于GUI显示和具有下划线字符的检索值之间的差异,是否有其他解释 我正在使用python 3.6和tkinter 8.6 这里有一个例子 多谢各位 import tkinter as tk from tkint
import tkinter as tk
from tkinter import ttk
DATA = [('180518-23', '23/06/18'),
('180618_24', '27/06/18')]
def invoice_selected(event):
row_selected = event.widget.focus()
values = event.widget.item(row_selected)['values']
invoicenumber = values[0]
print('invoice number', invoicenumber)
ROOT = tk.Tk()
header = ('Invoice', 'Due')
tree = ttk.Treeview(columns=header,
show="headings",
height=5)
tree.grid()
for col, text in enumerate(header):
tree.heading(col, text=text)
tree.bind('<<TreeviewSelect>>', invoice_selected)
for record in DATA:
tree.insert('', 'end', values=record)
ROOT.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
数据=[('180518-23','23/06/18'),
('180618_24', '27/06/18')]
已选择def发票(事件):
所选行=event.widget.focus()
values=event.widget.item(选中的行)['values']
发票编号=值[0]
打印('发票编号',发票编号)
ROOT=tk.tk()
标题=(‘发票’、‘到期’)
tree=ttk.Treeview(列=header,
show=“标题”,
高度=5)
tree.grid()
对于列,枚举中的文本(标题):
树标题(列,文本=文本)
树。绑定(“”,已选择发票)
对于数据中的记录:
插入(“”,'end',value=record)
ROOT.mainloop()
tl;dr:不要执行项目(选定的行)['values']
,而是执行项目(选定的行,选项='values')
我认为这实际上是tkinter中的一个bug,解决方法实际上依赖于另一个bug,所以我将这两个bug都归档为。但是让我们看看那边的tkinter专家怎么说
同时,你希望了解为什么这会带来不同,对吗 如果您查看以下文档: 查询或修改指定项的选项 如果未给出任何选项,则返回带有该项的选项/值的dict。如果指定了选项,则返回该选项的值。否则,将选项设置为kw给定的相应值 因此,如果您请求
values
选项,您将得到values
选项的值
但如果你什么都不要求,特金特会尝试变得聪明,给你一份包含所有选项的口述
问题在于,在封面下,tkinter是Tcl/Tk的包装器。在Tcl中,一切都是一个字符串(在这方面,它更像bash,而不是Python);数字123
和字符串'123'
之间没有区别。在TreeView
项中存储int是完全合法的,但它们的存储方式与字符串完全相同
Tcl代码返回的获取项目所有选项的是Tcl键值对列表,其中所有值都是Tcl字符串。Tkinter不知道哪些应该是字符串,哪些应该是int。2因此它尝试猜测:任何可以通过int
构造函数转换为int的字符串都是int,其他任何东西都是字符串。1而您的字符串可以转换为int
3,所以它是
当然,这是非常有黑客性的,但它通常做你想做的事情,当它做的时候,它会让事情变得更方便,而“非常有黑客性,但通常做你想做的事情”几乎就是tkinter的定义
然而,我认为它应该认识到,虽然'123_456'
是一个完全有效的Python整数文本,但它不是Tcl为整数创建的字符串,所以它不应该尝试解析它
如果您想查看执行此操作的代码:calls,它以值转换器的形式调用
但是为什么不在单个键值对上运行转换器呢?老实说,我看不出有什么好的理由。但事实并非如此,因此我们可以利用这一事实来解决这个问题
一,。如果一个值应该是一个浮点数呢?嗯,这在
TreeView
s中不经常出现,所以tkinter不需要考虑这个问题;您只需获取浮点的字符串表示形式。但在其他类型中,如LabeledScale
,浮动更有用/更常见,如果字符串中有
,它使用不同的函数尝试float
,而不是int
二,。如果您想知道这是什么样子,即使在解析了Tcl列表之后,也可以尝试打印tree.tk.call(tree.\w,'item',row\u selected)
vs.tree.tk.call(tree.\w,'item',row\u selected,'-values')的结果。
三,。在早期版本的Python中,180618_24
不是有效的int文本,因此仍然会得到一个字符串。但是在3.6中,下划线被允许作为组分隔符,所以180618_24
是拼写18061824
的一种非常有效的方法,所以这就是您得到的