回答編集履歴

3

追記2

2019/04/26 16:21

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -183,3 +183,21 @@
183
183
  main()
184
184
 
185
185
  ```
186
+
187
+ ---
188
+
189
+ もう少し追記:
190
+
191
+
192
+
193
+ 最初の回答に書いたdo_somethingという関数名はわかりにくかったようなのでon_start_buttonという関数名に変えました。この関数の定義場所に注意してください。注意すべきはon_start_button関数を
194
+
195
+
196
+
197
+ (A)main関数の中で定義すること
198
+
199
+ (B)button2の生成より前に定義すること
200
+
201
+
202
+
203
+ です。(A)の理由はmain関数のローカル変数col_varsをon_start_buttonからアクセスするため。(B)の理由はButton生成のcommand引数には「その時点で関数が定義済みでないといけないから」です。

2

追記

2019/04/26 16:21

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -63,3 +63,123 @@
63
63
  ...
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ ---
70
+
71
+ 追記:
72
+
73
+
74
+
75
+ 質問文にコードを追記していただいたのですが・・・自分の回答は質問者さんによく伝わらなかったようです。また、ボタンを押したときに呼び出されるハンドラー関数からどの範囲の変数が見えるか、ファイルダイアログを開いたりDataFrameをロードしたり、GUIの初期化をしたりといったもろもろの制御の流れをどう記述したらよいか等々についてはっきりとイメージできていないような印象でしたので、「何が問題でどうしたらよいか」という説明をするかわりに、単純な例を書いてみることにしました。下記を動かし動作を確認した上で個々のコードがどういうふうに動くのかを考えてみてはいかがでしょう?
76
+
77
+
78
+
79
+ スミマセンが、自分が不自然に感じた細々とした点は断りなしに変更させていただいています。
80
+
81
+
82
+
83
+ ```Python
84
+
85
+ import os
86
+
87
+ import tkinter as tk
88
+
89
+ import tkinter.filedialog
90
+
91
+ import codecs
92
+
93
+ import pandas as pd
94
+
95
+
96
+
97
+
98
+
99
+ def main():
100
+
101
+ root = tk.Tk()
102
+
103
+ root.withdraw()
104
+
105
+
106
+
107
+ # ファイルダイアログにより処理対象のファイルパスを選ばせる
108
+
109
+
110
+
111
+ filetypes = [("", "*.csv")]
112
+
113
+ initialdir = os.path.abspath(os.path.dirname(__file__))
114
+
115
+ filepath = tk.filedialog.askopenfilename(filetypes=filetypes,initialdir=initialdir)
116
+
117
+
118
+
119
+ # ファイルを読み込む
120
+
121
+ with codecs.open(filepath, "r", "cp932", "ignore") as file:
122
+
123
+ df = pd.read_table(file, delimiter=",", skipinitialspace=True)
124
+
125
+ columns = df.columns.values
126
+
127
+
128
+
129
+ # ウィンドウの初期化
130
+
131
+ sub_win = tk.Toplevel()
132
+
133
+ sub_win.geometry("385x400")
134
+
135
+
136
+
137
+ # データフレーム上の列数分だけ Checkbotton を生成すると仮定
138
+
139
+ col_vars = []
140
+
141
+ for i, column in enumerate(columns):
142
+
143
+ col_var = tk.IntVar()
144
+
145
+ col_vars.append(col_var)
146
+
147
+ cb = tk.Checkbutton(sub_win, variable=col_var, text=column)
148
+
149
+ cb.place(x=50, y=30 + (i * 24))
150
+
151
+ label0 = tk.Label(sub_win, text=u'Data cleaning[.csv]')
152
+
153
+ label0.place(x=5, y=5)
154
+
155
+
156
+
157
+ # ボタンのハンドラー関数
158
+
159
+ def on_start_button():
160
+
161
+ for i, column in enumerate(columns):
162
+
163
+ checked = 'checked' if col_vars[i].get() else 'is not checked'
164
+
165
+ print(f"{column} column {checked}")
166
+
167
+ # 必要に応じて何かする
168
+
169
+
170
+
171
+ button2 = tk.Button(sub_win, text='Start!', command=on_start_button)
172
+
173
+ button2.place(x=5, y=250)
174
+
175
+ root.mainloop()
176
+
177
+
178
+
179
+
180
+
181
+ if __name__ == '__main__':
182
+
183
+ main()
184
+
185
+ ```

1

for文に制御変数iを追加

2019/04/26 16:07

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
  col_vars = []
52
52
 
53
- for cn in columns:
53
+ for i, cn in enumerate(columns):
54
54
 
55
55
  col_var = tk.IntVar()
56
56