2013-03-11 2 views
0

변수 dirpath를 export_data() 함수에 전달하려고합니다. 내보내기 데이터는 위젯에있는 버튼을 두 번 클릭하여 실행됩니다. dirpath를 인쇄하는 이유는 다음과 같습니다.함수 사이에서 변수를 전달하는 파이썬 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

+0

PS. 'dirpath '가 왜 글로벌 변수인지 생각하지 않습니다. 그것은 당신의'export_data()'함수의 인자이고, 따라서 local입니다. – alexis

+0

아마도 그게 더 명확합니까? – bigl

답변

1

당신은 질문 :

수출 데이터가 위젯에있는 버튼을 두 번 클릭 떨어져 실행됩니다.

당신이 이벤트에 바인딩

<Tkinter.Event instance at 0x8ade56c>는, 항상 바인딩 바운드 함수에 매개 변수로 이벤트 객체를 보냅니다로 왜 dirpath 인쇄입니다. 따라서 수행중인 경우 :

widget.bind("<Double-1>", export_data) 

... 그러면 export_data은 이벤트를 유일한 매개 변수로 수신합니다.

변수를 전달하려면 lambda 또는 functools.partial 또는 함수 발생기를 사용해야합니다. 예 :

widget.bind("<Double-1", lambda event: export_data(dirpath)) 
+0

감사합니다. – bigl

+0

예, 이것이 더 나은 해결책입니다. 가능하면 전역 함수를 사용하지 말고'output_path'를 인수로 전달하십시오. – alexis

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