2013-03-11 115 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