Python喜欢在函数之间传递变量



我试图将变量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将接收事件作为其唯一参数。

要传递变量,需要使用lambdafunctools.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)。按照您的方法,参数声明隐藏了同名的全局变量。

最新更新