0

我正在尝试将变量 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
4

2 回答 2

1

在您提出的问题的正文中:

双击小部件上的按钮即可导出数据。为什么 dirpath 打印为:

<Tkinter.Event instance at 0x8ade56c>

当您绑定到事件时,绑定始终将事件对象作为参数发送给绑定函数。所以,如果你正在做:

widget.bind("<Double-1>", export_data)

...然后export_data将接收该事件,因为它是唯一的参数。

要传递变量,您需要使用lambdaorfunctools.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))
于 2013-03-11T13:54:20.033 回答
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)。按照您的方式,参数声明隐藏了同名的全局变量。

于 2013-03-11T13:53:05.003 回答