

今回やりたいことは、GUI画面からテキストボックスに値を入力したのを、外部ファイル（CSVに書き込むためのファイル）に格納したい。  
二つのファイルがあり、一つはGUIファイル(sample_tkinter.py),もう一つが実行ファイル(merge.py)になります。

GUIの機能は、

１テキストボックス  
２テキストボックスの値を取得するボタン  
３閉じるボタン

・word1にテキストボックスの値を取得できていると思っていますが、以下のようなエラーができてしまいます。  
①writer.writerow(word1)  
_csv.Error: iterable expected, not function  
② writer.writerow(word1)  
_csv.Error: iterable expected, not NoneType

・スクリプトを二つに分ける意味は特になく、二つに分けるというのが依頼内容ということです。

・CSVファイルの詳細として、特定のことは決まっていなく、とりあえずテキストボックスの値をCSVに書き込みをしたいだけになります。

コードが以下です。

**sample_tkinter.py**

[code]

    import tkinter as tk
    
    root=tk.Tk()
    root.geometry("300x300")
    
    entry=tk.Entry()
    entry.place(x=20,y=30)
    
    button=tk.Button(text="OK")
    button.place(x=150,y=29)
    
    word1=""
    def click():
        global word1
        word1=entry.get()
        #entry.delete(0,tk,tk.END)
        label=tk.Label(text=word1)
        label.place(x=20,y=50)
    
    button["command"]=click
    
    def close_window():
     root.destroy()
    
    botton1=tk.Button(text="閉じる",command=close_window)
    botton1.pack()
    
    root.mainloop()
    
[/code]

**merge.py**

[code]

    import csv
    from sample_tkinter import word1
    with open("sample.csv","w",encoding="shift-jis")as csvfile:   writer=csv.writer(csvfile,lineterminator="\n")
        print(word1)
        writer.writerow(word1)
    
[/code]

上記については解決しましたが、書き込んだCSVが、一文字がセル一つと文字列が分解して表示されてしまいます。  
例えば、テキストボックスの値が”あいうえお”だとすると、CSV上では  
A | B | C | D | E  
あ | い | う | え | お  
以上のように表示されます。  
こちらの解決方法をご教授願います。


CC BY-SA 4.0
2022-08-08T06:31:17.127
90432
2023-08-18T12:02:15.257
2022-08-08T08:42:31.400
53752
53752
question
python csv tkinter
tkinterモジュールでテキストボックスに値を入力したものを取得して、外部ファイルに１セルに文字列を格納したい


この場合、`word1`は入力されたテキストでは無く、`def click():`で定義された関数のオブジェクトが入っています。  
それに該当するのは`word1=click`の処理ですね。

そのために文字列やリストを対象とする`writer.writerow()`のパラメータに指定するとエラーとなります。

最小限の変更で済ますとしたら、`sample_tkinter.py`の以下の部分を：

[code]

    def click():
        word=entry.get()
        entry.delete(0,tk.END)
        label=tk.Label(text=word)
        label.place(x=20,y=50)
    
    word1=click
    
[/code]

こちらのように変更することでしょう。`word1=click`は削除しておくことです。

[code]

    word1=''
    
    def click():
        global word1
        word1=entry.get()
        entry.delete(0,tk.END)
        label=tk.Label(text=word1)
        label.place(x=20,y=50)
    
    
[/code]

* * *

**追記：**

`word1`の内容が何であれ、まとまった一つのデータとして扱いたい場合は、`merge.py`の以下の行を：

[code]

        writer.writerow(word1)
    
[/code]

こちらに変更すれば良いでしょう。

[code]

        writer.writerow([word1])
    
[/code]

ただし入力した文字列にカンマ(`,`)を含んでいたりすると、全体をダブルクォーテーション(`"`)で囲まれるなどの処理が自動的に行われるので、Pythonの`csv`,`csvwriter`モジュールの仕様を把握して使用してください。


CC BY-SA 4.0
2022-08-08T07:32:08.360
90434
2022-08-08T09:05:09.920
2022-08-08T09:05:09.920
26370
26370
90432
answer