python tkinter在函数之间传递变量

时间:2013-03-11 13:29:18

标签: python compiler-errors tkinter instance-variables

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

2 个答案:

答案 0 :(得分:1)

在问题正文中你问:

  

导出数据会在双击位于a上的按钮时运行   小部件。为什么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))

答案 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)。你拥有它的方式,参数声明隐藏了同名的全局。