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

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

ただいまの
回答率

87.92%

python 入力ボックスの値を取得しファイルを読み込む

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,447
退会済みユーザー

退会済みユーザー

pythonでプログラムを開発中です。

入力ボックスの値を取得し、Excelファイルを読み込むには、どのように記述すべきなのか分からず足踏みしていますので質問させていただきました。

【イメージ】
・GUI画面を作成
・「参照」ボタン作成(クリックするとファイルファイアログ表示)
・入力ボックスを1つ作成(ここに選んだファイルパスが反映される)

【実現させたいこと】
・入力ボックスの値を取得して、Excelファイルの中身を全て読み込みたい。
・Excelファイルの1行目はヘッダー行なので、2行目から読み込みたい。

【困っているポイント】
・ファイル名を文字列として認識させ、処理する方法があるのか?

当方、pythonを触り始めてまだ間もないので、簡単なコード等記述していただければ大変助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/01/24 15:46

    まずはコードを提示してくれないと答えようがないです。

    コード制作依頼してるつもりなら、ここはそういうところじゃありません

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/01/24 17:10 編集

    前回私の質問にコメントを頂いた方ですよね?
    前回は私がコードを載せて質問した後、コメントを頂いて私が返信しましたがそのままのようですね。
    コード提示しても解決に結びつかないようであれば、別の方法を考えるしかないですよね。
    ここは出来なくで困っている人たちに対して、解決せずただコメントをする場所ですか?
    コードがあったら解決できるということであれば、今回も再度、私が作成中のコードを以下のURLに貼り付けておきますね。
    https://harigami.jp/cd?hsh=7a0a2b52-f7b4-4c69-be36-b523c023dfd3

    キャンセル

  • y_waiwai

    2020/01/24 17:15 編集

    ここで回答がつかないというのは、ほとんどが質問が意味不明であるためです。
    その意味不明の質問をなんとか意味がわかるようにするためにコメントしてますが、その結果、いぜん意味不明なのが少なくありません。

    こちらも別にカネもらってるわけじゃないので、一度言って理解できない相手は放置するようにしております。
    まあ、あなたがどう思おうと自由です。これからもがんばってくださいませ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/01/24 17:25 編集

    >その意味不明の質問をなんとか意味がわかるようにコメントしてますが
    →コメント頂いて返信したにも関わらず、そのままスルーされるようでは上記の仰っている内容に矛盾が生じますね。。

    結局コードを提示しても解決できないんだなあということがよく理解できました。
    ありがとうございます!

    キャンセル

回答 1

checkベストアンサー

+1

・ファイル名を文字列として認識させ、処理する方法があるのか?

ファイル名は文字列ですよ。
tkinterを一切使わず、ファイル名を引数に取ってexcelを読み出す関数を作れますか?
そのあと、tkinterのGUI処理からその関数を呼び出すようにすればいいです。

ファイル名を決定するまでの処理を整理してみました。

import tkinter as tk
from tkinter.ttk import *
from tkinter.filedialog import askopenfilename
from tkinter import messagebox as msgbox
import os
import re


class Data:

    def __init__(self):
        self.ftype = tk.IntVar(value=1)
        self.date = tk.StringVar()
        self.filename = tk.StringVar()
        self.num = tk.StringVar()

    def is_valid_date(self, text):
        return (not text) or len(text) <= 6 and text.isdecimal()

    def select_file(self):
        path = askopenfilename(initialdir=r'C:\Python',
                               filetypes=[('Excel File', '*xlsx')])
        if path:
            self.filename.set(path)

    def validate(self):
        date = self.date.get()
        if not re.match("[0-9]{6}", date):
            msgbox.showwarning(message="date format error")
            return False

        filename = self.filename.get()
        if not os.path.exists(filename):
            msgbox.showwarning(message="file not found")
            return False

        return True


def execute(data):
    if not data.validate():
        return
    print("ftype:", repr(data.ftype.get()))
    print("date:", repr(data.date.get()))
    print("filename:", repr(data.filename.get()))
    print("num:", repr(data.num.get()))


def setup(view, data):
    view.propagate(False)
    view.pack(expand=True, fill=tk.BOTH)
    pad = {"padx": 10, "pady": 10}

    w = Label(view, text='取込ファイル種別')
    w.grid(row=0, column=0, cnf=pad)
    w = Radiobutton(view, text='Shipment Report',
                          value=1, variable=data.ftype)
    w.grid(row=0, column=1, cnf=pad)
    w = Radiobutton(view, text='New Product Shipment Report',
                          value=2, variable=data.ftype)
    w.grid(row=0, column=2, cnf=pad, sticky=tk.W)

    w = Label(view, text='取込年月')
    w.grid(row=1, column=0, cnf=pad)
    vcmd = (view.register(data.is_valid_date), '%P')
    w = Entry(view, textvariable=data.date)
    w.configure(validate="key", validatecommand=vcmd)
    w.grid(row=1, column=1, cnf=pad, sticky=tk.W)

    w = Label(view, text='取込ファイル')
    w.grid(row=2, column=0, cnf=pad)
    w = Entry(view, textvariable=data.filename)
    w.grid(row=2, column=1, columnspan=3, cnf=pad, sticky=tk.E + tk.W)

    w = Button(view, text='参 照', width=16, command=data.select_file)
    w.grid(row=2, column=4, cnf=pad, sticky=tk.W)

    w = Label(view, text='取込件数')
    w.grid(row=3, column=0, cnf=pad)
    w = Entry(view, textvariable=data.num)
    w.grid(row=3, column=1, cnf=pad, sticky=tk.W)
    w = Label(view, text='件')
    w.grid(row=3, column=2, cnf=pad, sticky=tk.W)

    w = Button(view, text='実 行 ', width=16, command=lambda: execute(data))
    w.grid(row=4, column=4, cnf=pad, sticky=tk.W)


def main():
    app = tk.Tk()
    app.title('データインポートプログラム')
    app.resizable(False, False)
    setup(tk.Frame(app), Data())
    app.mainloop()


if __name__ == "__main__":
    main()

main関数はアプリケーション担当。
GUIとデータを用意して描画処理やイベント処理(mainloop)をします。

setup関数はGUI構築担当。構築以外の仕事はしません。

Dataクラスはデータ担当。整合性確認などデータに関する処理だけを担当。

execute関数は、渡されたデータを使って実行処理を担当。
実行ボタンが押されたときに呼ばれます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/27 16:08

    イメージがついてきました。
    ありがとうございます。

    因みにここのサイトは、個人宛に質問をすることは可能なのでしょうか?

    キャンセル

  • 2020/01/27 16:27

    個人宛に質問するなら家庭教師を雇いましょう。

    キャンセル

  • 2020/01/27 16:29 編集

    確かにそうですね。
    詳しくご教授いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る