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

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

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

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

Python

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

Q&A

解決済

2回答

4889閲覧

python tkinterで値を取得したあと、テキストボックスを閉じたい

tomatocco

総合スコア24

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/07/13 03:42

編集2020/07/13 07:40

・テキストボックスで最大値と最小値を入力してもらい、その値を取得して計算を行いたいです。
・複数のテキストボックスを順番に表示したいです。

【やりたいことの全体】
①最大値・最小値の入力後に「OK」ボタンを押す
②①のテキストボックスが消える
③ファイルの読み込みテキストボックスが現れファイルを選択する
④計算を開始。

※訂正※1回目は問題なく動きましたが、2回目実行しようとすると終わりません。
それぞれでは実行できるのですが、①②と③、①②と④と組み合わせると処理が終わらないようで、いつまでたっても完了になりません。
どの部分を訂正すべきかも分かりません。
Python初心者です。ご教授頂きたくよろしくお願いいたします。

#①②コード def close_window(): global MAX,MIN MAX =text.get() MIN=text2.get() win.destroy() win = tk.Tk() win.title("範囲を指定してください") win.geometry("500x250") # サイズを指定 # 部品を作成 --- (*2) # ラベルを作成 label = tk.Label(win, text=u'最大値:') label.pack() # テキストボックスを作成 text = tk.Entry(win) text.pack() label2 = tk.Label(win, text=u'最小値:') label2.pack() # テキストボックスを作成 text2 = tk.Entry(win) text2.pack() button = tk.Button(win,text = "OK", command = close_window) button.pack() win.mainloop() #③のコード root = tk.Tk() root.withdraw() tk.messagebox.showinfo('','ファイルを選択してください!') fTyp=[('テキストファイルとExcelファイル','*.txt;*.csv')] filename2=tkfd.askopenfilename(filetypes=fTyp) test_data2=pd.read_csv(filename2,encoding="cp932",index_col=0)

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

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

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

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

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

guest

回答2

0

ベストアンサー

Jupyter notebook 上での入力は、
ipywidgets の SelectionRangeSlider 等を調べてみると良いかもしれません。


tkinter でダイアログを使うサンプル

Tk() を複数回呼び出す場合、特に destroy() してから再度使う際には注意が必要です。
tkinter.Tk() は、モジュール内グローバル変数 tkinter._default_root を設定し、
ダイアログ作成にrootを指定しなかった場合、暗黙的にデフォルトのrootが使われます。

間違いという訳ではありませんが、問題に繋がるケースが多いので
可能ならば Tk() はプロセス内で一度にします。

Jupyter notebook内で呼び出す場合は、初期化部分を別セルに別けるか、
後述のコードのような、tkinter._default_rootを再利用するコードを用います。

Tk()を複数回呼び出す様なケースでは、
大抵はウィンドウを閉じたい場合(Tk自体は終了しない)なので Toplevel で解決できます。

python

1#!/usr/bin/env python3.8 2 3import tkinter as tk 4from tkinter import simpledialog 5 6 7class MinMaxDialog(simpledialog.Dialog): 8 9 def __init__(self, parent, title, prompt=""): 10 self._prompt = prompt 11 super().__init__(parent, title) 12 13 def body(self, master): 14 self._ok = False 15 self._minVar = tk.IntVar(value=0) 16 self._maxVar = tk.IntVar(value=10) 17 if self._prompt: 18 tk.Message(master, text=self._prompt).pack() 19 tk.Label(master, text="Min:").pack() 20 tk.Entry(master, textvar=self._minVar).pack() 21 tk.Label(master, text="Max:").pack() 22 tk.Entry(master, textvar=self._maxVar).pack() 23 24 def apply(self): 25 self._ok = True 26 27 def getreult(self): 28 return self._ok, (self._minVar.get(), self._maxVar.get()) 29 30 31def _get_default_root(master): 32 """ 33 tkinter.Tk のインスタンス再生成を抑制する 34 """ 35 if not master: 36 if tk._support_default_root and tk._default_root: 37 master = tk._default_root 38 else: 39 master = tk.Tk() 40 master.withdraw() 41 return master 42 43 44# TODO: default min/max vars 45def askminmax(title="", prompt="", parent=None): 46 dialog = MinMaxDialog(_get_default_root(parent), title, prompt) 47 return dialog.getreult() 48 49 50def main(): 51 from tkinter.filedialog import askopenfilename 52 53 ok, result = askminmax("1回目") 54 if ok: 55 minVal, maxVal = result 56 print("Min:{}, Max:{}".format(minVal, maxVal)) 57 58 print(askopenfilename()) 59 60 61 # Jupyter notebook 上での実行なら、こちらは不要 62 ok, result = askminmax("2回目", "test") 63 if ok: 64 minVal, maxVal = result 65 print("Min:{}, Max:{}".format(minVal, maxVal)) 66 67 print(askopenfilename()) 68 69 70if __name__ == '__main__': 71 main() 72

投稿2020/07/14 02:57

teamikl

総合スコア8664

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

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

tomatocco

2020/07/14 05:06

ありがとうございました。
guest

0

import部分がソースにないのでこちらで補完しましたが、
それで動作させた分には正常に動いていると思います。

python

1import tkinter as tk 2from tkinter import messagebox 3from tkinter import filedialog as tkfd 4import pandas as pd 5 6#①②コード 7def close_window(): 8 global MAX,MIN 9 MAX =text.get() 10 MIN=text2.get() 11 win.destroy() 12 13win = tk.Tk() 14win.title("範囲を指定してください") 15win.geometry("500x250") # サイズを指定 16 17# 部品を作成 --- (*2) 18# ラベルを作成 19label = tk.Label(win, text=u'最大値:') 20label.pack() 21 22# テキストボックスを作成 23text = tk.Entry(win) 24text.pack() 25 26label2 = tk.Label(win, text=u'最小値:') 27label2.pack() 28 29# テキストボックスを作成 30text2 = tk.Entry(win) 31text2.pack() 32 33button = tk.Button(win,text = "OK", command = close_window) 34button.pack() 35 36win.mainloop() 37 38#③のコード 39root = tk.Tk() 40root.withdraw() 41messagebox.showinfo('','ファイルを選択してください!') 42fTyp=[('テキストファイルとExcelファイル','*.txt;*.csv')] 43 44filename2=tkfd.askopenfilename(filetypes=fTyp) 45test_data2=pd.read_csv(filename2,encoding="cp932",index_col=0)

投稿2020/07/13 05:49

yureighost

総合スコア2183

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

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

tomatocco

2020/07/13 07:39

ありがとうございます。 認識できていなかったのですが、 1回目は問題なく動きましたが、2回目実行しようとすると終わりません。
yureighost

2020/07/13 07:55

こちらはvscodeで実行してますが、ファイルを読み込んだ後にプログラムが終了し、 特に二回目の実行で動作が変わるようなことはないですね。 エラーが出ているとか、ソースのどの部分で処理が止まってしまうとかはわからないでしょうか。
teamikl

2020/07/13 10:06

win10/python3.8コマンドラインで実行ですが、 同じく問題を再現できませんでした。 気になる点はありますが、 問題は掲載されているコード以外にもありそうですね。 - どんな環境で、どのように2回目を実行しているのか。 - (4) と組み合わせてとあるので、他のコードがあるのかどうか。 ---- ※ 問題との関連は、現時点の情報だけでは解りませんが、 気になる点: Tk() のインスタンスを2回以上作るのは避けた方が良いです。 Tk()でウィンドウとイベントループが作られるのですが、 ウィンドウを閉じてもイベントループ(mainloop)が終了していない →処理が止まるという事は起こり得ます。
tomatocco

2020/07/13 23:41

ありがとうございます。 ・(4)を含まない場合でも同じ状態です。 ・python 3.7.4 を使用しています。Jupiternootbookを使用しています。 ・エラーは出てきません。処理が終わらない状態です。 ・teamikiさんのおっしゃるTk()を省いてみました。  ③のコードの  root = tk.Tk()  root.withdraw() の部分を取り除いたら、繰り返し実行が可能でした。  ただ、何も書かれていないテキストボックスが発生してしまいます。  何か対応できるのでしょうか? ・python 3.8へのバージョンアップもやってみます。
teamikl

2020/07/13 23:59

同プロセス内で同じコードを2回実行ということだったのですね。 コードをコピーし、同じコードを繰り返し実行するようにして現象が確認出来ました。 暫定的な回避策: 「ウィンドウを閉じてもイベントループ(mainloop)が終了していない」という状態だったので close_window関数内の最後に win.quit() で mainloop() を抜け、後続の処理を実行できます。 解決策: Tk() のインスタンスを複数回作るのは問題になる事が多いので、 Toplevel を使ってダイアログを作る方が良いです。tkinter.simpledialog.Dialog 辺りを参考に。
tomatocco

2020/07/14 02:19

ありがとうございます。 ご教授頂いた通りに修正すると、実行できました。 Toplevelも使用しました。 お時間いただきありがとうございました。
tomatocco

2020/07/14 02:28

teamiklさんをベストアンサーに選択したいのですが、どのようにすればよろしいのでしょうか?
teamikl

2020/07/14 02:39

動作確認用に作成したコードがあるので回答に投稿しますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問