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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

5375閲覧

Tkinterで選んだ項目を関数の外で使用したい。

temtemtemtem

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

PyCharm

エディター・開発ツール

0グッド

1クリップ

投稿2020/04/05 16:13

前提・実現したいこと

tkinterでファイルとシートを選んで、選んだEXCELファイルをDataframeに変えたいのですがうまくいきません。
excelのsheet名は時と場合によって変わるので、GUIに一覧を表示させてそこから選びたいです。
なかなかうまくいかず、ネットにもドンピシャなアドバイスはなかったと感じています。

最終的にはexcelの処理ファイル<excelのファイルを選ぶ関数<シートを選ぶ関数(モジュール?)という風にしたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

特にありませんが、関数の外にリストを持ち出せません。 選ぶExcel sheetは必ず1つです。

該当のソースコード

python

1def sheet_select(sheets): 2 import tkinter as tk 3 root = tk.Tk() 4 root.title('sheet選択') 5 # フレームの作成 6 7 # フレーム1(上側:リストボックスを格納する) 8 frame = tk.Frame() 9 frame.grid(row=0, sticky="we") 10 # フレーム2(下側:ボタンを格納する) 11 frame_button = tk.Frame() 12 frame_button.grid(row=1, sticky="we") 13 14 # データ(リストボックスに表示させる) 15 list_value = tk.StringVar() 16 list_value.set(['sheet1', 'sheet2']) 17 18 # リストボックスの作成 19 lb = tk.Listbox(frame, height=8, listvariable=list_value, selectmode="single") 20 lb.pack() 21 22 # テキストの作成 23 text_str = tk.StringVar() 24 text_str.set("OKを押して下さい") 25 text = tk.Label(frame_button, textvariable=text_str) 26 text.grid(row=0, columnspan=3) 27 # tk.messagebox.showinfo('CBD比較プログラム','Sheetsを選んでください') 28 def ok_button(): 29 selected = [] 30 for i in lb.curselection(): 31 selected.append(lb.get(i, i)[0]) 32 print(selected) 33 34 def close_window(): 35 root.destroy() 36 37 button = tk.Button(frame_button, text="OK", command=lambda: [ok_button(), close_window()]) 38 button.grid(row=1, column=0, columnspan=2) 39 print(selected) 40 # 画面の表示 41 root.mainloop()

試したこと

global変数やクラスにするというものはネットで見つけたのですが、コンソールに表示されるだけだったり、
関数内でしか結局使えず、断念しました。
私がまだ勉強を始めたばかりで的外れなことをしているかもしれないのですがアドバイスをよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

python3.7.1
pycharm

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

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

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

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

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

guest

回答1

0

ベストアンサー

1. selectedリストをok_button関数の外へ

selected = [] # <- ok_button関数の外に出す def ok_button(): for i in lb.curselection(): selected.append(lb.get(i, i)[0]) print(selected)

関数の中で定義された場合、その関数の実行が終わった時、
どこからも参照がなければ、変数の中身は破棄されてしまいます。

また、関数の外側から関数内の変数を参照することは出来ないため、
保持したい変数は外側のスコープに置きます。

一番上のスコープ、インデントなしで宣言する変数がグローバル変数ですが、
今回の場合は、ok_button関数の直前で良いです。

2. select_sheet() 関数から値を返す

# 画面の表示 root.mainloop() return selected # <- 追加

プログラムはウィンドウを閉じることで、
mainloop()を抜け、次の処理に移ります。

3. 呼び出し側、戻り値を受け取る

selected = select_sheet(...)

追記2:

選ぶExcel sheetは必ず1つです。

tk.Listboxの引数で複数選択に出来ます。

diff

1- selectmode="single") 2+ selectmode="multiple")

追記1: Modern Python Standard Library Cookbook に
リストから選択するダイアログ ChoiceDialogクラスの実装例がありました。
ソースコードがあったので、参考資料として追記します。

Modern-Python-Standard-Library-Cookbook/Chapter13/gui_04.py

投稿2020/04/05 16:53

編集2020/04/05 17:30
teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問