2013-03-11 136 views
0

我想将变量dirpath传递到export_data()函数。导出数据的方式是双击位于窗口小部件上的按钮。为什么dirpath打印如下:python tkinter函数之间传递变量

`<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

你可能会弄清楚你有什么问题,并提出一个问题吗?你的故事有点遍布地图。 – alexis 2013-03-11 13:37:48

+0

PS。我不知道你为什么认为'dirpath'是一个全局变量;这是你的'export_data()'函数的参数,因此是本地的。 – alexis 2013-03-11 13:40:20

+0

也许这更清晰? – bigl 2013-03-11 13:47:20

回答

1

在问题的身体,你问:

导出数据运行了在位于一个 控件按钮双击的。为什么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)) 
+0

问题解决谢谢 – bigl 2013-03-11 14:00:37

+0

是的,这是更好的解决方案。尽可能避免在函数中使用全局变量 - 也将'output_path'作为参数。 – alexis 2013-03-11 14:06:11

0

显然Tkinter将一个事件,而不是一个字符串,你的回调。如果dirpath是一个全局变量(如!你写before--重要信息),也许你的意思是这样定义你的回调:

def export_data(_ignored): 
    print 'exporting...' 
    print str(dirpath) 
    os.mkdir('/home/bigl/Desktop/Library') 
    shutil.copytree(dirpath, output_path) 

现在你的函数可以使用全局dirpath(和output_path)。你的方式,参数声明隐藏了同名的全局。

+0

这个效果很好。我会尽力让我的问题下次更清晰谢谢 – bigl 2013-03-11 14:01:29