2017-01-06 13 views
1

私の問題は、基本機能が終了したらプログラムを実行しているということです。ファイルを保存するかどうかを尋ねるポップアップボックスが表示されます。保存ダイアログボックスが表示されます。私が保存しているデータはdict値なので、私はtkinterからErrorを受け取っています。私はどこにdictのがそれらに保存することができますが、私はこの間違った方法について行くか、私のコード内に問題がある読んでいるようにセーブポイントとして ".csv"拡張子を使用しようとしました。そのためTkinterのは、それが辞書を保存できないことを裏投げのPython 3.5 Tkinter dictをファイルに保存する方法

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Lewis Collins\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "C:/Users/Lewis Collins/PycharmProjects/program_06.01.17/Home.py", line 108, in run_language_model 
    main.flag_detection() 
    File "C:\Users\Lewis Collins\PycharmProjects\program_06.01.17\main_code\main.py", line 179, in flag_detection 
    savename = asksaveasfile(file_opt, defaultextension=".csv") 
    File "C:\Users\Lewis Collins\AppData\Local\Programs\Python\Python35-32\lib\tkinter\filedialog.py", line 423, in asksaveasfile 
    return open(filename, mode) 
TypeError: open() argument 2 must be str, not dict 

def flag_detection(): 

total_count = Counter(traffic_light) 
total_count.keys() 
for key, value in total_count.items(): 

    EWT = tkinter.messagebox.askquestion('File Level', 'Would you like to save') 

    file_opt = options = {} 
    options['filetypes'] = [('all files', '.*'), ('text files', '.csv')] 
    options['initialfile'] = 'myfile.csv' 

    if EWT == 'yes': 
     savename = asksaveasfile(file_opt, defaultextension=".csv") 
     savename.write(key, ':', value) 

エラーメッセージ:コードと理由コードの

オリジナルスニペット以下の説明を更新しました

私は問題を引き起こしているstrにdictを変換する以下の解決策を試しました

Tkinterのためをstrに変換する関数の試みの

コードスニペット:

def flag_detection(): 


total_count = Counter(traffic_light) 
total_count.keys() 
for key, value in str(total_count.items()): 
    EWT = tkinter.messagebox.askquestion('File Level', 'Would you like to save') 
    file_opt = options = {} 
    options['filetypes'] = [('all files', '.*'), ('text files', '.csv')] 
    options['initialfile'] = 'myfile.csv' 

    if EWT == 'yes': 
     savename = asksaveasfile(file_opt, defaultextension=".csv") 
     savename.write(key, ':', value) 

ので、私は非常にJSONを理解していなかったとのdictに変換するstr(total_count.items()):をしようとして使用するために自分のコードを更新しましたし、それらを読んだ後にライブラリをpickleしてみると、私は必要なものを複雑に思えました。ユーザーが見ることができるようにファイルへの単純な出力です。

私は今、このエラー受け付けております:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Lewis Collins\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "C:/Users/Lewis Collins/PycharmProjects/program_05.0.17/Home.py", line 108, in run_language_model 
    main.flag_detection() 
    File "C:\Users\Lewis Collins\PycharmProjects\program_05.0.17\main_code\main.py", line 169, in flag_detection 
    for key, value in str(total_count.items()): 
ValueError: not enough values to unpack (expected 2, got 1) 

任意の提案やフィードバックを、事前のおかげで大歓迎です。 asksaveasfileを呼び出す方法だけではなく、

savename = asksaveasfile(file_opt, defaultextension=".csv") 

+1

あなたのdictsを保存するために 'pickle'や' json'を使うことができます。 –

+0

@ Jean-FrançoisFabre私はこれらのライブラリを見てきましたが、私はこれらを避け、可能であればビルド済みのPythonライブラリを使いたいと考えています。 –

+1

'csv'は' pickle'や 'json'と同じように組み込まれています。標準パッケージです。さらに良い方法は、テキストファイルに 'str(dictionnary)'を書いてから 'ast.literal_eval'(標準パッケージ)を使って読み込みます。 –

答えて

2

最初の問題は、このラインです。 asksaveasfileは、最初の引数として辞書を使用しません。あなたはfile_opt1のオプションを使用する場合は、この方法でそれを呼び出す必要があります。

savename = asksaveasfile(defaultextension=".csv", **file_opt) 

あなたはこの文を書いてみる場合は、次の問題があることを修正した場合:

savename.write(key, ':', value) 

あなたが得ますこのエラーメッセージ:TypeError: write() takes exactly 1 argument (3 given)。つまり、3つの引数ではなく、1つの引数を指定する必要があります。あなたは正確に1つの引数をwriteを与えることによってそれを解決することができます:あなたがしたいすべてのファイルに辞書を保存している場合

savename.write("%s: %s" % (key, value)) 

はしかし、jsonモジュールは、これは非常に簡単になり、値を反復することなく。 CSVファイルとして保存したい場合は

import json 
... 
def flag_detection(): 

    total_count = Counter(traffic_light) 

    EWT = tkinter.messagebox.askquestion('File Level', 'Would you like to save') 

    file_opt = options = {} 
    options['filetypes'] = [('all files', '.*'), ('text files', '.json')] 
    options['initialfile'] = 'myfile.json' 

    if EWT == 'yes': 
     savefile = asksaveasfile(defaultextension=".json", **file_opt) 
     json.dump(total_count, savefile) 

、同様の方法で動作しますDictWriterクラスのドキュメントを読んで:、JSONとして保存このように見えるようにあなたのflag_detection方法を変更するには

+0

ありがとう、このように説明してくれてありがとうございます。私は 'savename.write'をどのようにレイアウトしたのですか?私のコードの他の領域が 'savename.write("%s:%s "%(key、value))の同様の引数値を使用したときに間違っていました。コードがあまりにも多くなっているのは数週間前のことだと思う。しかし、もう一度、jsonの例で説明しても、私が読んでいたものよりはるかに明確なライブラリが説明されています –

関連する問題