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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

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

Tkinter

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

9596閲覧

【Tkinter】「quit」ボタンを押してウィンドウを閉じたい!! +α

yamayamaki

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

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

Tkinter

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/09/02 08:32

使用している言語

Python3

前提・実現したいこと

①「quit」ボタンを押してウィンドウを閉じたい。さらに、コンソール画面の状態を「In [1] 」のように新しいコードを実行できる状態(「実行待ち」の状態)にしたい。

②「def click_import_csv()」内のfilename, dfをローカル変数からグローバル変数にしたい。

該当のソースコード

def import_csv_and_confirm(): #パス取得 & CSV読込・データ列(先頭・最後尾)の確認 print(""" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ インポートするCSVを選択!!(別ウィンドウが起動) ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ """) #パス取得--------------------------------------------------- import tkinter as tk from tkinter.filedialog import askopenfilename root=tk.Tk() root.withdraw() filename_csv_import = askopenfilename() # show an "Open" dialog box and return the path to the selected file #CSV読込・データ列(先頭・最後尾)の確認--------------------------------------------------- import pandas as pd df_csv_import = pd.read_csv(filename_csv_import) return filename_csv_import, df_csv_import # df_csv_import.head(), df_csv_import.tail() filename, df = import_csv_and_confirm() #--------------------------------------------------- import tkinter as tk from tkinter import messagebox as mbox root = tk.Tk() root.title("Hello, World!") #タイトル作成 root.geometry("500x500") #縦画面のサイズ指定 # ラベルを作成--------------------------------------------------- label = tk.Label(root, text='インポートするCSVを選択!!(別ウィンドウが起動)') label.pack() # ボタンを押した時 --------------------------------------------------- def click_import_csv(): filename, df = import_csv_and_confirm() mbox.showinfo('confirm', filename + 'デスネ') res1 = tk.Label(root, text=filename) res1.pack() res2 = tk.Label(root, text=df) res2.pack() return filename, df #a, b = click_import_csv() #print(a) #print(b) #ボタンを使って Tkinter ウィンドウを閉じる--------------------------------------------------- def endup1(): root.destroy def endup2(): root.quit() def endup3(): root.destroy exit() def endup4(): root.quit() exit() def endup5(): import sys root.destroy sys.exit() def endup6(): import sys root.quit sys.exit() # ボタンを作成 --------------------------------------------------- button1 = tk.Button(root, text='csvファイルをimport', command=click_import_csv) button1.pack() button2 = tk.Button(root, text='quit', command=endup6) button2.pack() root.mainloop()

試したこと

①-1 commandに直接「root.destroy」を入力
→ウィンドウ:閉じた。
コンソール画面:まだ「実行中」の状態。

①-2 command=endup1
→ウィンドウ:同様に「root.destroy」のみ実行されるはずなのに、ウィンドウは閉じない。
コンソール画面:ウィンドウが閉じないので、「実行中」の状態。しかし、ウィンドウ右上の「✖」で閉じるとコンソール画面は「実行待ち」の状態になる。

①-3 command=endup2
→ウィンドウ:閉じずに、フリーズする。
コンソール画面:ウィンドウはフリーズするものの、「実行待ち」の状態になる。

①-4 command=endup3
→ウィンドウ:閉じない。
コンソール画面:ウィンドウが閉じないので、「実行中」の状態。

①-5 command=endup4
→ウィンドウ:閉じる。
コンソール画面:すべてのコンソールがリセットされて、「実行待ち」の状態になる。
※これが一番理想に近いが、できればすべてのリセットは避けたい。

①-6 command=endup5
→ウィンドウ:閉じずに、フリーズする。
コンソール画面:「UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)」と表示されて、「実行待ち」の状態になる。

①-7 command=endup6
→ウィンドウ:閉じずに、フリーズする。
コンソール画面:「UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)」と表示されて、「実行待ち」の状態になる。

②-1 戻り値に対して「a, b = click_import_csv()」として表示させようと試みたが、コンソールは「実行中」の状態なので、変数エクスプローラーには表示されない。
(【質問:コンソールに表示されないだけで、a, b には戻り値が入っているということなのでしょうか?】)
ボタンを実行したときだけcsvを読み込んでdfを作りたいので、最初から関数の外に変数を置いてしまうと未定義変数としてエラーになる。

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

Python3
Anaconda navigator 1.9.12
Spyder3.3.6

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

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

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

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

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

teamikl

2020/09/03 12:24

JupyterやIPython上の入力とは異なり、 Python のコードでは root.destroy や root.quit は、 括弧を付けないとメソッドを呼び出しません。 root.destroy()のように括弧を付けて試すと、 各実行結果はどう変化しますか?
guest

回答1

0

実行環境が解らなかったので、試せませんでしたが

python

1def endup1(): 2 root.destroy()

ではどうでしょう?

Jupyter(IPython) 環境等では、メソッドの括弧を省略する設定もありますが、
Pythonのコード内では root.destroyメソッドの呼び出しに括弧は必要です。
省略するとメソッドは呼び出されず、双方は異なる挙動になります。


他の問題点: root = tk.Tk() について

プログラム中で何度も Tk のインスタンスを作成するのはお勧めしません。

tkinterモジュール内でグローバル変数を使っていて、
複数回 Tk クラスのインスタンスを作ると、以前の値を上書きしてしまうので、
場合によっては、おかしな挙動を引き起こす事があります。

  • 新しいウィンドウ(ダイアログ)を表示したい場合は Toplevel クラスを使います。

  • tk.Tk() と mainloop は、基本プログラム中で一度のみ。

 ウィンドウを破棄するには destroy
mainloop を終了する為には quit を使います

対話環境の場合、ダイアログのみの利用であれば
1つの関数内でTk()生成~mainloop~quit迄、完結するような利用法もありますが、
root オブジェクトとダイアログのウィンドウ(Toplevel)を区別して運用する方法も検討して見て下さい。

具体的には、import_csv_and_confirmのローカル変数のroot、
import_csv_and_confirm 関数を単体で呼び出す場合、rootが必要ですが、
既に他の箇所で Tk のインスタンスが作成されている場合は、不要になります。

投稿2020/09/04 11:50

編集2020/09/04 11:52
teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問