我正在尝试将变量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
答案 0 :(得分:1)
在问题正文中你问:
导出数据会在双击位于a上的按钮时运行 小部件。为什么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))
答案 1 :(得分:0)
显然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
)。你拥有它的方式,参数声明隐藏了同名的全局。