質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

4206閲覧

python tkinter LListbox , Entryで選択カラム配列化

masayam4

総合スコア4

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/08 11:39

読み込んだcsvファイル(データフレーム)のカラムを選択して
選択カラムに対する解析ができるように、Listboxを活用して作成したいなと考えています。

List boxカラムを選択 → Entryに挿入 → 挿入したカラムを配列として解析処理用def ana_doに渡す → 選択カラムを使い X ,yの配列を作成 → 解析処理

Entryから選択カラムを渡す所がうまくいきません。X ,yに選択したカラムで配列を組む方法ないでしょうか?
素人な質問で申し訳ありません。

python

1import sys 2import tkinter as tk 3import tkinter.filedialog as tkfile 4from tkinter import filedialog 5from tkinter import ttk 6from datetime import datetime 7import pandas as pd 8from sklearn.model_selection import train_test_split 9import os, tkinter, tkinter.filedialog, tkinter.messagebox 10 11 12class Application(tk.Frame): 13 def __init__(self, master): 14 super().__init__(master) 15 16 self.master = master 17 self.master.title('ana_ver2') 18 self.master.geometry("500x700") 19 self.master.configure(bg='azure') 20 self.create_widgets() #widget作る時に必要コード 21 22 23#--------------------widjet----------------------------------------------------------------------- 24 def create_widgets(self): 25 varS = tkinter.StringVar() 26 varT = tkinter.BooleanVar() 27 #------csv read-------------------------------------------------------------- 28 self.input_box = tkinter.Entry(width=40,fg='grey') #csvログインプット 29 self.input_box.place(x=10, y=50) 30 31 self.input_label = tkinter.Label(text="----csv read----",fg='grey',bg='snow') 32 self.input_label.place(x=10, y=20) 33 34 self.button = tkinter.Button(text="read",command=file_select) 35 self.button.place(x=400, y=52) 36 #------select X, y--------------------------------------------------------------------- 37 self.input_label = tkinter.Label(text="----select X , y----",fg='grey',bg='snow') 38 self.input_label.place(x=10, y=80) 39 40 self.input_box2 = tkinter.Entry(textvariable=varT,width=40) 41 self.input_box2.delete(0,tk.END) 42 self.input_box2.place(x=10, y=110) 43 44 self.listbox = tk.Listbox(selectmode="multiple") 45 self.listbox.configure(width=30,height=10) 46 self.listbox.place(x=10, y=200) 47 48 self.btn3 = tk.Button(text='X_select',command = lambda : btn_click3(self.input_box.get())) 49 self.btn3.place(x=400,y=106) 50 51 self.input_box3 = tkinter.Entry(textvariable=varT,width=40) 52 self.input_box3.delete(0,tk.END) 53 self.input_box3.place(x=10, y=140) 54 55 self.btn4 = tk.Button(text='y_select',command = lambda : btn_click4(self.input_box.get())) 56 self.btn4.place(x=400,y=146) 57 #------- time ---------------------------------------------------------------------------------------------------------------- 58 59 self.label4 = tk.Label(text=datetime.now().strftime("%Y/%m/%d %H:%M:%S"),fg="black",bg="snow",font=("meiryo",20,"bold")) 60 self.label4.place(x=40,y=600) 61 self.master.after(50,self.update) 62 63 #--------ana ---------------------------------------------------------------------------------------------------------------------------- 64 65 self.btn5 = tk.Button(text='----ana-----',command = lambda : ana_do(self.input_box.get(),self.input_box2.get(),self.input_box3.get())) 66 self.btn5.place(x=200,y=400) 67 68#---------------------------------------------------------------------------------------------------------- 69 70 71 72#------csv botton1 push------------------------------------------------------------------------ 73def file_select(): 74 idir = 'C:\python_test' #初期フォルダ 75 filetype = [("","*")] #拡張子の選択 76 file_path = tkinter.filedialog.askopenfilename(filetypes = filetype, initialdir = idir) 77 app.input_box.insert(tkinter.END, file_path) #結果を表示 78 79 df_a = pd.read_csv(file_path) 80 #カラムlistbox表示 81 col_name=df_a.columns.values 82 83 for item in col_name: 84 app.listbox.insert(tkinter.END, item) 85#------select botton3 , 4 push------------------------------------------------------------------------------------ 86 87def btn_click3(FP): 88 df_a = pd.read_csv(FP) 89 col_name=df_a.columns.values 90 91 if len(app.listbox.curselection()) == 0: 92 return 93 index = list(app.listbox.curselection())#タプルをかえす 94 95 app.input_box2.insert(tkinter.END, col_name[index]) 96 #テキストbox clear 97 app.listbox.select_clear(0,tk.END) 98 99def btn_click4(FP): 100 df_a = pd.read_csv(FP) 101 col_name=df_a.columns.values 102 103 if len(app.listbox.curselection()) == 0: 104 return 105 index = list(app.listbox.curselection())#タプルをかえす 106 107 app.input_box3.insert(tkinter.END, col_name[index]) 108 #テキストbox clear 109 app.listbox.select_clear(0,tk.END) 110 111#---ana botton5 push -------------------------------------------------------------- 112def ana_do(FP,X,y): 113 df_a = pd.read_csv(FP) 114 col_name=df_a.columns.values 115 116 X_a=df_a[X] 117 y_a=df_a[y] 118 119#この後解析処理 120 121#------------------------------------------------------------------------------ 122root = tk.Tk() 123app = Application(master=root) 124app.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Entryから選択カラムを渡す所がうまくいきません。

両方のEntryに値が入ってしまう現象の事でしょうか?
希望の動作は解りませんが、問題がありそうな点は

  • Entry の textvariable ... StringVar を期待するところで BooleanVarが使われている
  • textvariable=varT が2つの Entery で共有されています。-> 同じ値が入ってしまう原因
  • 関数の終わりではローカル変数にいれた StringVar() は破棄されます。

解決策

  • input_box2, input_box3 用の StringVar を個別に用意する
  • StringVar の変数も、他と同じようなインスタンス変数(self.付きでアクセス)にする

python

1# コードは部分抜粋 2 3 self.varS1 = tkinter.StringVar() # StringVarを準備/インスタンス変数へ保存 4 self.varS2 = tkinter.StringVar() 5 6 self.input_box2 = tkinter.Entry(textvariable=self.varS1,width=40) 7 self.input_box3 = tkinter.Entry(textvariable=self.varS2,width=40)

先日同じ様な質問があったので参考に。(起こっている現象は異なりますが、原因と対策方法が同じです)
TkInter ラジオボタンのグループ単位での、単一選択制御ができない。


コメントを受けて回答追記:

原因: Entry に一旦格納してから、他の関数に渡している為に文字列になってしまいます

解決策:

  • 文字列をパースしてリストを取り出す (eval はお勧めしにくいのですが、ast.literal_eval等)
  • Entry に入れるときに、別の変数にそのリストを保存しておく。
  • 他の案: UI の変更で、X のリストボックスと y のリストボックスを用意する。

他のUI改善案として、tkinterのコンボボックスは複数選択できませんが、
下のコード、コンボボックスで複数選択可能にするサンプルがあります。
how-do-i-enable-multiple-selection-of-values-from-a-combobox

Entry相当の表示領域に選ばれた項目をカンマ区切りで表示して、
入力すしようとクリックすると、チェック可能なリストボックスが開きます。

投稿2020/06/08 13:33

編集2020/06/09 09:20
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masayam4

2020/06/09 08:51

teamikl様 回答ありがとうございます。両方のEntryに同じ値が入ってしまうのも問題としてありました。 希望の動作としては、Entryの値をget()で出力した際に、 ["age" "job" "marital" "education"]と文字列?になってしまい。。。 ["age","job","marital","education"]のようにデータフレームで選択カラムの配列が作れるようにしたいのですが何か良い方法ありますでしょうか?
teamikl

2020/06/09 09:20 編集

文字列のリストとしてデータが欲しいという事ですね。 (回答に追記しました)
masayam4

2020/06/09 10:56

1つ目の解決策で解決しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問