【问题标题】:python tkinter passing variables between functionspython tkinter在函数之间传递变量
【发布时间】:2013-03-11 13:29:17
【问题描述】:

我正在尝试将变量 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 是一个全局变量;这是您的 export_data() 函数的参数,因此是本地的。
  • 或许这样更清楚?
  • 好多了!现在可以猜测问题了。
  • 你是在讽刺还是什么?如果您需要更多,我还应该提供什么。有很多代码,我认为展示所有代码并不重要。我确保返回 dirpath,我认为这已经足够了

标签: python compiler-errors tkinter instance-variables


【解决方案1】:

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

双击位于 小部件。为什么 dirpath 打印为:

&lt;Tkinter.Event instance at 0x8ade56c&gt;

当您绑定到一个事件时,绑定总是将一个事件对象作为参数发送给绑定函数。所以,如果你正在这样做:

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

【讨论】:

  • 是的,这是更好的解决方案。尽可能避免在函数中使用全局变量——也将 output_path 作为参数传递。
【解决方案2】:

显然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-04-09
  • 2013-03-07
  • 2020-06-06
  • 1970-01-01
  • 2019-06-28
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多