我试图将变量dirpath传递到export_data()函数中。导出数据只需双击位于小部件上的按钮即可。为什么dirpath打印为:
`<Tkinter.Event instance at 0x8ade56c>`
而不是实际路径?
def export_data(dirpath):
print 'exporting...'
print str(dirpath)
os.mkdir('/home/bigl/Desktop/Library')
shutil.copytree(dirpath, output_path)
当我运行我的代码时,我得到错误
exporting...
<Tkinter.Event instance at 0x8ade56c>
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "/media/LOFTUS/20130308_searchtest.py", line 44, in export_data
shutil.copytree(dirpath, output_path)
File "/usr/lib/python2.7/shutil.py", line 169, in copytree
names = os.listdir(src)
TypeError: coercing to Unicode: need string or buffer, instance found
在问题正文中:
导出数据时,双击位于小部件。为什么dirpath打印为:
<Tkinter.Event instance at 0x8ade56c>
当绑定到一个事件时,绑定总是发送一个事件对象作为绑定函数的参数。所以,如果你在做:
widget.bind("<Double-1>", export_data)
…则export_data
将接收事件作为其唯一参数。
要传递变量,需要使用lambda
或functools.partial
或某种函数生成器。例如:
widget.bind("<Double-1>", lambda event: export_data(dirpath))
但是,要小心这个。传递给export_data
的值将是事件发生时dirpath
的值,该值可能与创建绑定时的值不同。如果你有一个想传递给函数的局部变量,你可以将它设置为一个关键字参数的默认值,在这种情况下,lambda
创建时的值将被传递。
的例子:
path = some_function()
widget.bind("<Double-1>", lamba event, dirpath=path: export_data(dirpath))
显然,Tkinter
向回调传递一个事件,而不是字符串。如果dirpath
是一个全局变量(正如您之前所写的——重要的信息!),也许您打算这样定义回调:
def export_data(_ignored):
print 'exporting...'
print str(dirpath)
os.mkdir('/home/bigl/Desktop/Library')
shutil.copytree(dirpath, output_path)
现在您的函数可以使用全局dirpath
(和output_path
)。按照您的方法,参数声明隐藏了同名的全局变量。