0

変数 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
4

2 に答える 2

1

あなたが尋ねた質問の本文で:

データのエクスポートは、ウィジェットにあるボタンをダブルクリックすることで実行されます。dirpath が次のように出力される理由:

<Tkinter.Event instance at 0x8ade56c>

イベントにバインドすると、バインドは常にイベント オブジェクトをパラメータとしてバインドされた関数に送信します。だから、もしあなたがやっているなら:

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

...その後export_data、唯一のパラメーターとしてイベントを受け取ります。

変数を渡すには、または何らかの関数ジェネレーターを使用する必要がありlambdaますfunctools.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))
于 2013-03-11T13:54:20.033 に答える
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)を使用できるようになりました。あなたがそれを持っていたように、引数宣言は同じ名前のグローバルを隠していました。

于 2013-03-11T13:53:05.003 に答える