Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter treeview行显示值与下划线不符_Python_Tkinter - Fatal编程技术网

Python tkinter treeview行显示值与下划线不符

Python tkinter treeview行显示值与下划线不符,python,tkinter,Python,Tkinter,我有一个发票相关数据的树状视图显示。发票标识符有下划线。我注意到下划线在GUI中正确显示,但是从树行数据获得的发票编号值忽略了下划线。 在将数据插入完整的应用程序以处理该问题之前,我目前正在进行-for_u的替换 我使用treeview或检索用户选择的行数据的方式是导致问题的原因吗?或者,对于GUI显示和具有下划线字符的检索值之间的差异,是否有其他解释 我正在使用python 3.6和tkinter 8.6 这里有一个例子 多谢各位 import tkinter as tk from tkint

我有一个发票相关数据的树状视图显示。发票标识符有下划线。我注意到下划线在GUI中正确显示,但是从树行数据获得的发票编号值忽略了下划线。 在将数据插入完整的应用程序以处理该问题之前,我目前正在进行-for_u的替换

我使用treeview或检索用户选择的行数据的方式是导致问题的原因吗?或者,对于GUI显示和具有下划线字符的检索值之间的差异,是否有其他解释

我正在使用python 3.6和tkinter 8.6

这里有一个例子

多谢各位

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
的一种非常有效的方法,所以这就是您得到的