我正在编写一个简单的脚本,它创建一个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
代码:
主要问题是为循环中的
Treeview
创建绑定。在只有一个双击事件可以为树声明和触发,而不是逐行声明和触发,这里您将在每次迭代中重写它。在
众所周知,此lambda模式可以为for/循环中的小部件声明命令,因此它可以很好地实现以下目的:
但是这里声明了一个默认参数
f
,lambda将使用事件绑定给定的event
参数执行,这就是异常:<ButtonPress event state=Mod1...
不管怎样,我们发现在您的情况下,即使您用第二个参数修复lambda以接受
event
而不替换默认值f
,这在您的情况下是行不通的。在我建议使用每行的
values
字段来存储信息URIallegato"
,而不在树中显示列。在然后,您可以通过使用
^{pr2}$focus()
来获取所选项目,并提取值来获取URI,从而将一个通用事件绑定到Treeview。在如果您想检查是否有要打开的URI,这里几乎不能使用lambda。在
当事件触发时,tkinter将传递一个事件对象。您试图打开该事件对象,就好像它是一个文件一样。在
为什么?让我们从重写lambda作为一个适当的函数开始。您的lambda相当于此函数:
当事件触发时,它的作用相当于:
^{pr2}$给脚本一个位置参数}相同。在
event
,它被分配给第一个关键字参数。因此f
与{解决方案是确保您的
lambda
接受事件,它可以忽略它:{{{{cd2>将与^ cd2>参数相关联。在
相关问题 更多 >
编程相关推荐