Tkinter/TTK防止字符串到按钮的转换

2024-09-30 22:18:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的脚本,它创建一个ttk Treeview(充当一个表),当您双击它时,它会打开一个文件(路径保存在字典中)。但是,当您双击一行时,会出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Maicol\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py",
line 1699, in __call__
    return self.func(*args)
  File "C:\Users\Maicol\Documents\Projects\App_WINDOWS\School_Life_Diary\note.py",
line 195, in <lambda>
    lambda f=nt[x]["URIallegato"]: os.startfile(str(f)))
FileNotFoundError: [WinError 2] Can't find the specified file: '<ButtonPress event state=Mod1 num=1 x=677 y=37>'

问题是这个代码:

^{pr2}$

允许双击并打开文件。在

以下是完整的Treeview代码:

^{3}$

Tags: 文件lambda代码inpy路径脚本字典
2条回答

主要问题是为循环中的Treeview创建绑定。在

只有一个双击事件可以为树声明和触发,而不是逐行声明和触发,这里您将在每次迭代中重写它。在


众所周知,此lambda模式可以为for/循环中的小部件声明命令,因此它可以很好地实现以下目的:

lambda f=nt[x]["URIallegato"]: os.startfile(str(f))

但是这里声明了一个默认参数f,lambda将使用事件绑定给定的event参数执行,这就是异常:<ButtonPress event state=Mod1...

不管怎样,我们发现在您的情况下,即使您用第二个参数修复lambda以接受event而不替换默认值f,这在您的情况下是行不通的。在


我建议使用每行的values字段来存储信息URIallegato",而不在树中显示列。在

然后,您可以通过使用focus()来获取所选项目,并提取值来获取URI,从而将一个通用事件绑定到Treeview。在

^{pr2}$

如果您想检查是否有要打开的URI,这里几乎不能使用lambda。在

当事件触发时,tkinter将传递一个事件对象。您试图打开该事件对象,就好像它是一个文件一样。在

为什么?让我们从重写lambda作为一个适当的函数开始。您的lambda相当于此函数:

def handle_event(f=default_value):
    os.startfile(str(default_value))

当事件触发时,它的作用相当于:

^{pr2}$

给脚本一个位置参数event,它被分配给第一个关键字参数。因此f与{}相同。在

解决方案是确保您的lambda接受事件,它可以忽略它:

lambda event, f=nt[x]["URIallegato"]: os.startfile(str(f)))

{{{{cd2>将与^ cd2>参数相关联。在

相关问题 更多 >