pythonでプログラムを開発中です。
入力ボックスの値を取得し、Excelファイルを読み込むには、どのように記述すべきなのか分からず足踏みしていますので質問させていただきました。
【イメージ】
・GUI画面を作成
・「参照」ボタン作成(クリックするとファイルファイアログ表示)
・入力ボックスを1つ作成(ここに選んだファイルパスが反映される)
【実現させたいこと】
・入力ボックスの値を取得して、Excelファイルの中身を全て読み込みたい。
・Excelファイルの1行目はヘッダー行なので、2行目から読み込みたい。
【困っているポイント】
・ファイル名を文字列として認識させ、処理する方法があるのか?
当方、pythonを触り始めてまだ間もないので、簡単なコード等記述していただければ大変助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/24 08:13 編集
2020/01/24 08:20 編集
退会済みユーザー
2020/01/24 08:25 編集
回答1件
0
ベストアンサー
・ファイル名を文字列として認識させ、処理する方法があるのか?
ファイル名は文字列ですよ。
tkinterを一切使わず、ファイル名を引数に取ってexcelを読み出す関数を作れますか?
そのあと、tkinterのGUI処理からその関数を呼び出すようにすればいいです。
ファイル名を決定するまでの処理を整理してみました。
python
1import tkinter as tk 2from tkinter.ttk import * 3from tkinter.filedialog import askopenfilename 4from tkinter import messagebox as msgbox 5import os 6import re 7 8 9class Data: 10 11 def __init__(self): 12 self.ftype = tk.IntVar(value=1) 13 self.date = tk.StringVar() 14 self.filename = tk.StringVar() 15 self.num = tk.StringVar() 16 17 def is_valid_date(self, text): 18 return (not text) or len(text) <= 6 and text.isdecimal() 19 20 def select_file(self): 21 path = askopenfilename(initialdir=r'C:\Python', 22 filetypes=[('Excel File', '*xlsx')]) 23 if path: 24 self.filename.set(path) 25 26 def validate(self): 27 date = self.date.get() 28 if not re.match("[0-9]{6}", date): 29 msgbox.showwarning(message="date format error") 30 return False 31 32 filename = self.filename.get() 33 if not os.path.exists(filename): 34 msgbox.showwarning(message="file not found") 35 return False 36 37 return True 38 39 40def execute(data): 41 if not data.validate(): 42 return 43 print("ftype:", repr(data.ftype.get())) 44 print("date:", repr(data.date.get())) 45 print("filename:", repr(data.filename.get())) 46 print("num:", repr(data.num.get())) 47 48 49def setup(view, data): 50 view.propagate(False) 51 view.pack(expand=True, fill=tk.BOTH) 52 pad = {"padx": 10, "pady": 10} 53 54 w = Label(view, text='取込ファイル種別') 55 w.grid(row=0, column=0, cnf=pad) 56 w = Radiobutton(view, text='Shipment Report', 57 value=1, variable=data.ftype) 58 w.grid(row=0, column=1, cnf=pad) 59 w = Radiobutton(view, text='New Product Shipment Report', 60 value=2, variable=data.ftype) 61 w.grid(row=0, column=2, cnf=pad, sticky=tk.W) 62 63 w = Label(view, text='取込年月') 64 w.grid(row=1, column=0, cnf=pad) 65 vcmd = (view.register(data.is_valid_date), '%P') 66 w = Entry(view, textvariable=data.date) 67 w.configure(validate="key", validatecommand=vcmd) 68 w.grid(row=1, column=1, cnf=pad, sticky=tk.W) 69 70 w = Label(view, text='取込ファイル') 71 w.grid(row=2, column=0, cnf=pad) 72 w = Entry(view, textvariable=data.filename) 73 w.grid(row=2, column=1, columnspan=3, cnf=pad, sticky=tk.E + tk.W) 74 75 w = Button(view, text='参 照', width=16, command=data.select_file) 76 w.grid(row=2, column=4, cnf=pad, sticky=tk.W) 77 78 w = Label(view, text='取込件数') 79 w.grid(row=3, column=0, cnf=pad) 80 w = Entry(view, textvariable=data.num) 81 w.grid(row=3, column=1, cnf=pad, sticky=tk.W) 82 w = Label(view, text='件') 83 w.grid(row=3, column=2, cnf=pad, sticky=tk.W) 84 85 w = Button(view, text='実 行 ', width=16, command=lambda: execute(data)) 86 w.grid(row=4, column=4, cnf=pad, sticky=tk.W) 87 88 89def main(): 90 app = tk.Tk() 91 app.title('データインポートプログラム') 92 app.resizable(False, False) 93 setup(tk.Frame(app), Data()) 94 app.mainloop() 95 96 97if __name__ == "__main__": 98 main()
main関数はアプリケーション担当。
GUIとデータを用意して描画処理やイベント処理(mainloop)をします。
setup関数はGUI構築担当。構築以外の仕事はしません。
Dataクラスはデータ担当。整合性確認などデータに関する処理だけを担当。
execute関数は、渡されたデータを使って実行処理を担当。
実行ボタンが押されたときに呼ばれます。
投稿2020/01/24 09:48
編集2020/01/27 02:50総合スコア5406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/27 02:19
2020/01/27 02:30
2020/01/27 02:49 編集
退会済みユーザー
2020/01/27 02:50
2020/01/27 02:52
退会済みユーザー
2020/01/27 03:53
2020/01/27 04:11
退会済みユーザー
2020/01/27 04:31
2020/01/27 04:51 編集
退会済みユーザー
2020/01/27 05:15
2020/01/27 05:41 編集
2020/01/27 05:47
退会済みユーザー
2020/01/27 05:51
2020/01/27 06:10 編集
退会済みユーザー
2020/01/27 06:11
2020/01/27 06:40
退会済みユーザー
2020/01/27 06:50
2020/01/27 06:58 編集
退会済みユーザー
2020/01/27 07:08
2020/01/27 07:27
退会済みユーザー
2020/01/27 07:29 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。