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

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

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

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

Python

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

Q&A

解決済

1回答

1185閲覧

PythonのTKで2つのWindowを操作したい

mikami_r

総合スコア13

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/12/08 07:17

pythonのTkで二つの画面を操作したいです。
現在のコードは以下です。
実施したいことは画面1(tk1_Window)を実行し、OK1を押した後に画面1(tk_Window)を閉じる。
閉じた後に画面2(tk2_Window)を表示させたいです。

Python

1import tkinter as tk1 2import tkinter as tk2 3 4tk_range = "" 5 6def tk1_window(): 7 8 #画面生成 9 tk1_root = tk1.Tk() 10 tk1_root.geometry("200x200") 11 tk1_root.title("TK1") 12 13 def ok1(): 14 global tk_range 15 tk_range = "ok" 16 tk1_root.quit() 17 18 #ok1ボタン 19 ok1_button = tk1.Button(tk1_root,text = "ok1", command = ok1,font=("",20),state=tk1.NORMAL) #ボタンを使って関数使用 20 ok1_button.place(x=100, y=100) 21 22 tk1_root.mainloop() #作成ウインドの表示と維持.mainloop() #作成ウインドの表示と維持 23 24tk1_window() 25 26while tk_range == "ok": 27 print("TK1完了") 28 print("tk_range:"+tk_range) 29 break 30 31 32def tk2_window(): 33 34 #画面生成 35 tk2_root = tk2.Tk() 36 tk2_root.geometry("200x200") 37 tk2_root.title("TK2") 38 39 def ok2(): 40 global tk_range 41 tk_range = "ok" 42 tk2_root.quit() 43 44 #ok2ボタン 45 ok2_button = tk2.Button(tk2_root,text = "ok2", command = ok2,font=("",20),state=tk2.NORMAL) #ボタンを使って関数使用 46 ok2_button.place(x=100, y=100) 47 48 tk2_root.mainloop() #作成ウインドの表示と維持.mainloop() #作成ウインドの表示と維持 49 50tk2_window() 51

上記のソースコードを実行すると、画面1と画面2が両方表示されます。(イメージは下図)
イメージ説明

やりたいことはOK1を押したときにTK2のみ表示される状態にしたいです。
以上、素人質問で申し訳ありませんがご教授のほど、お願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import tkinter as tk1 2import tkinter as tk2

モジュールを別名でインポートしてるだけなので、
コードの意図としては誤りです。

python

1import tkinter as tk 2 3tk1_root = tk.Tk() 4tk1_root.mainloop() 5tk1_root.destroy() 6 7tk2_root = tk.Tk() 8tk2_root.mainloop() 9tk2_root.destroy() 10

注意点が一つあって、tk.Tk() と mainloop は必ず一つのみにします。

python

1# 誤り 2 3tk1_root = tk.Tk() 4tk2_root = tk.Tk()

tk.Tk() は、モジュールの初期化 + ウィンドウ(Toplevel) を担います。

初期化が2度実行されてしまう為、前のインスタンスを破棄した後でないとトラブルの元になります。
2つのウィンドウを同時に使いたい場合は、2つめには tk.Toplevel を利用してください。


python

1while tk_range == "ok": 2 print("TK1完了") 3 print("tk_range:"+tk_range) 4 break 5

は、不要です。tkinter のウィンドウは
mainloop の部分で、ウィンドウが閉じられるまで待機します。

python

1tk1_window() 2 3# ここは tk1 のウィンドウが閉じた後で実行される。 4 5# ループは不要です。 6# もし、ループの意図が「ok ボタンが押されるまで待機」という目的だった場合、 7# ここではできません。この時点でウィンドウは破棄されてます。→ 設計の問題 8 9if tk_range == "ok": 10 print(f"TK1 完了 {tk_range}") 11 12 tk2_window()

参考: tkinter 入力ダイアログ

ダイアログとして実装すると、while 文で意図されてるようなコードで
「手続き型」での制御が可能になります。

通常の GUI プログラミングは、「イベント駆動型」といって、
GUI操作等によって呼び出される関数は、即座に終了して処理を返さないと
ウィンドウが応答なしになってしまいます。
mainloop が待機ループとなっているので、他の待機ループを持つことができません。

投稿2021/12/10 05:00

編集2021/12/10 05:02
teamikl

総合スコア8760

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

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

mikami_r

2021/12/13 10:34 編集

本件に関してのご教授御礼申し上げます。 ご教授頂いた内容に関して詳細をご教授頂くことは可能でしょうか? tk.Tk() は、モジュールの初期化 + ウィンドウ(Toplevel) を担います。 初期化が2度実行されてしまう為、前のインスタンスを破棄した後でないとトラブルの元になります。 2つのウィンドウを同時に使いたい場合は、2つめには tk.Toplevel を利用してください。 →当方の解釈違いの場合は誠に申し訳ありませんが、2つのWindowを同時に使用したいわけではありません。1つめのメインウインドウが閉じたら二つ目のメインウインドウが起動するようにしたいです。
teamikl

2021/12/13 11:00

> 1つめのメインウインドウが閉じたら二つ目のメインウインドウが起動するようにしたいです。 毎回初期化・終了するのであれば、質問のコードの場合は mainloop の後にウィンドウを閉じる destroy が必要になります。 (もしくは、root.quit() の代わりに root.destroy()) tk1_root = tk.Tk() # 初期化+メインウィンドウ tk1_root.mainloop() # ウインドウを表示+維持 tk1_root.destroy() # ウィンドウの破棄 <--- これが必要 ==== ウィンドウが2つ出る問題ではありませんが、 while 部分は意図された挙動になってないので確認してください。 while 文でOKボタンが押されるまで待機とはなりません、 OKボタンをクリック→イベントが呼ばれる→quit で mainloop を抜ける という流れになります。 tk1_window() 関数を抜けるのは、ウィンドウが閉じられた後なので、 判定は一度で良く、while ではなく if 文で判定可能です。
mikami_r

2021/12/13 12:38

回答御礼申し上げます。 ご教授頂いた内容で解決できました。 かなり助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問