蟒Tkinter的传递函数之间的变量(python tkinter passing variable

2019-08-17 11:45发布

我想变dirp​​ath传递到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

Answer 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))

小心这一点,但是。 传递给值export_data将是价值dirpath 在事件发生的时候 ,当你创建结合可能比的值不同。

如果您有要传递给函数的局部变量,你可以将其设置为默认值的关键字参数,在这种情况下,在时间值lambda创建将被传递。

例:

path = some_function()
widget.bind("<Double-1>", lamba event, dirpath=path: export_data(dirpath))


Answer 2:

很明显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 )。 你有它的方式,论证申报的藏身之全球的同名。



文章来源: python tkinter passing variables between functions