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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

5195閲覧

tkinterの複数画面を開いたときのmessageboxの親について

hijiri

総合スコア61

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/04/01 14:25

pythonのtkinterを使って、簡単なGUIを作ろうとしてます。

[main.py]

python

1import tkinter as tk 2import sub 3 4def call_sub(event): 5 sub.main() 6 7root = tk.Tk() 8root.geometry("1000x600") # サイズ 9 10btn_sub = tk.Button(root, text = "SUB") 11btn_sub.bind("<ButtonRelease-1>", call_sub) 12btn_sub.pack() 13 14root.mainloop()

[sub.py]

python

1import tkinter as tk 2from tkinter import messagebox 3 4def mess(event): 5 messagebox.showinfo("あいさつ", "おはようございます") 6 7def main(): 8 root1 = tk.Toplevel() 9 root1.geometry("800x500") 10 11 btn = tk.Button(root1, text = "メッセージ") 12 btn.bind("<ButtonRelease-1>", mess) 13 btn.pack() 14 15 root1.grid() 16 17if __name__ == "__main__": 18 main()

というコードを書いております。

main.pyからsub.pyを呼び出し、sub.pyの中でmessageboxを呼び出しているので、messeageboxの親はsub.pyのroot1だと考えていました。

しかし実際に実行してみると、messageboxの親はmain.pyのrootになっているようで、messageboxを呼び出している最中にsub.pyを閉じてもmessageboxは閉じません。
messageboxの代わりにsimpledialogをimportして実行してみても、やはり親はmain.pyに紐付けられていました。

Toplevel()の親指定の方法などは発見したのですが、messageboxやsimpledialogの親指定の方法は見つけることができませんでした。
このmessageboxの親をsub.pyにするにはどうしたらよろしいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

parent=引数に指定できます。

python

1def mess(event): 2 messagebox.showinfo("あいさつ", "おはようございます", parent=event.widget)

※ mess関数内からは root1 を直接参照できなかったため、
厳密には、このコードではボタンのイベント内で所得しているのでボタンが親になりますが、
期待通りサブウィンドウのモーダルにはなります。
(追記: event.widget.master にすれば root1 が親になりますが、
ボタンの親が変わると影響を受けます)

但し、メインウィンドウのモーダルではなくなる為、メインを閉じることはできるようになります。
必要なら sub のウィンドウに対して grab_set() を呼び出してください。

後、サブウィンドウがモーダルになってない現在の状態では
メイン画面で複数回「SUB」ボタンをクリックすると沢山ウィンドウが開きますが
root1 = tk.Toplevel(name="root1") と名前付けすることで、サブウィンドウを一つだけに出来ます。

投稿2020/04/01 15:13

編集2020/04/01 17:17
teamikl

総合スコア8664

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

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

hijiri

2020/04/02 00:12

ありがとうございます。 希望通りの挙動を得ることができました。 また、それ以外のことも教えていただき、ありがとうございます。 早速試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問