csvのcolumnsを動的に取得できたら便利だなと思い書いたのですが、
チェックボタンの選択で一個、一個が独立してチェックできるのではなく
一回押したら全部の欄にチェックがついていしまい困っています。
python
1import os,sys 2from tkinter import * 3import tkinter 4from tkinter import filedialog 5from fir_win import sub_window3 6import codecs 7import pandas as pd 8 9def func(): 10 sub_window3.func() 11 12 13def file_search(): 14 root = tkinter.Tk() 15 root.withdraw() 16 fTyp = [("","*.csv")] 17 iDir = os.path.abspath(os.path.dirname(__file__)) 18 filepath = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir) 19 sub_win = Toplevel() 20 with codecs.open(filepath, "r", "cp932", "ignore") as file: 21 df = pd.read_table(file, delimiter=",", skipinitialspace=True) 22 columns = df.columns.values 23 col_var = tkinter.IntVar() 24 for i in range(len(columns)): 25 col = tkinter.Checkbutton(sub_win, variable=col_var, text=columns[i])<--全部チェックがついてしまいます。 26 col.place(x=50, y=30 + (i * 24)) 27 num = col_var.get() 28 label0 = tkinter.Label(sub_win,text=u'Data cleaning[.csv]') 29 label0.place(x=5, y=5) 30 sub_win.geometry("385x400") 31 button2 = tkinter.Button(sub_win, text='Start!', command=func) 32 button2.place(x=5, y=250)
もしご存知の方がいらっしゃれば、ご教授頂きたく存じます。
python
1def do_something(): 2 sub_win = Toplevel() 3 col_var = tkinter.IntVar() 4 if col_vars[0].get(): 5 col_var = [] 6 for i, cn in enumerate(columns): 7 col_var = tkinter.IntVar() 8 col_vars.append(col_var) 9 col = tkinter.Checkbutton(sub_win, variable=col_var, text=cn) 10 col.place(x=50, y=30 + (i * 24)) 11 if col_vars[1].get():#繰り返し
KSwordOfHasteさんに教えていただいた情報を基に作成したインスタント部分です。
col_vars.append(col_var)
の部分でName is not definedになってしまいます。
追記:
python
1from tkinter import * 2import tkinter.ttk as ttk 3import tkinter 4import tkinter.filedialog as filedialog 5import pandas as pd 6import os,codecs 7 8class FiledialogApp(ttk.Frame): 9 10 def __init__(self, app): 11 super().__init__(app) 12 self.pack() 13 14 self.filename = StringVar() 15 16 label = ttk.Label(self,text="File>>") 17 label.pack(side="left") 18 filenameEntry = ttk.Entry(self,text="",textvariable= self.filename) 19 filenameEntry.pack(side="left") 20 21 button = ttk.Button(self,text="Select",command = self.openFileDialog) 22 button.pack(side="left") 23 24 button_c = ttk.Button(self, text="Close",command = quit) 25 button_c.pack(side="left") 26 27 def openFileDialog(self): 28 # ファイルダイアログにより処理対象のファイルパスを選ばせる 29 filepath = filedialog.askopenfilename(filetypes=[(".csv","*.csv")]); 30 self.filename.set(filepath) 31 # ファイルを読み込む 32 with codecs.open(filepath, "r", "cp932", "ignore") as file: 33 df = pd.read_table(file, delimiter=",", skipinitialspace=True) 34 columns = df.columns.values 35 # データフレーム上の列数分だけ Checkbotton を生成すると仮定 36 col_vars = [] 37 for i, column in enumerate(columns): 38 col_var = tkinter.IntVar() 39 col_vars.append(col_var) 40 cb = ttk.Checkbutton(variable=col_var, text=column) 41 cb.place(x=50, y=30 + (i * 24)) 42 43 # ボタンのハンドラー関数 44 def on_start_button(): 45 for i, column in enumerate(columns): 46 checked = 'checked' if col_vars[i].get() else 'is not checked' 47 print(f"{column} column {checked}") 48 # 必要に応じて何かする 49 50 button_1 = ttk.Button(text='Start!', command=on_start_button) 51 button_1.place(x=5, y=250) 52 53 54 55if __name__ == '__main__': 56 app = Tk() 57 app.geometry("400x300") 58 app.title("Select your file[.csv]") 59 frame = FiledialogApp(app) 60 app.mainloop()
教えていただいたコードでgui画面を作ってみました。
正常に動きました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/25 08:53 編集
2019/04/25 11:06 編集
2019/04/26 13:24
2019/04/26 15:13
2019/04/26 16:11