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

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

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

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

Python

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

Q&A

解決済

2回答

1016閲覧

tkinterの処理順が理解できない

ma2222222

総合スコア1

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/11/08 06:47

前提

ボタンを押すと新しいウィンドウが表示され処理を実行し、その処理が終わったら追加されたウィンドウを消するプログラムを作りたいです。

実現したいこと

該当のPythonファイルを開くとメインのウィンドウ(root)が表示される。
root上にあるボタンを押すと

新しいウィンドウの表示

PyAutoGUIによる自動操作
↓(操作終了)
追加したウィンドウの削除

の流れを実現したい。

発生している問題

root上にあるボタンを押すと

PyAutoGUIによる自動操作
↓(操作終了)
新しいウィンドウの表示

追加したウィンドウの削除

と順番がおかしいです。

該当のソースコード

python3.10.1

1 2import tkinter 3import pyautogui 4 5root = tkinter.Tk() 6root.title("タイトル1") 7root.geometry("250x270") 8root.attributes("-topmost", True) 9root.resizable(0,0) 10 11txtbox = tkinter.Text(root, font=("", 16)) 12 13(省略) 14 15def Syori() : 16 if not txtbox.get("1.0", "end-1c") == "" : 17 18 subWindow = tkinter.Toplevel() 19 subWindow.title("タイトル2") 20 subWindow.geometry("250x270") 21 subWindow.attributes("-topmost", True) 22 subWindow.resizable(0,0) 23 24 (PyAutoGUIによる自動操作) 25 26 subWindow.destroy() 27 28 else: 29 (省略) 30 31Syori_button = tkinter.Button(text="実行",command=Syori,width=16,height=3) 32Syori_button.place(x=70,y=140)

ウィジェットの設置といった関係ない部分は省略しました。

補足情報

  • Windows10
  • python 3.10.1 64bit
  • tkinter 8.6.12
  • VScodeにて編集
  • 自動操作は理想通りの動きで問題ないです

問題の新しいウィンドウは添えるだけで特に意味は無いのですがモヤモヤします。
どの部分が問題なのか検討もつかないです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

いちおうウインドウ作成後に.updateを呼び出せば当方環境(Win10+Anaconda)では表示はされました。
ただし何らかの処理中にイベント処理していないと、固まったような表示になってしまいます。
参考:TKinter Popup Progress Bar

Python

1import tkinter 2import time 3 4root = tkinter.Tk() 5root.title("タイトル1") 6root.geometry("250x270") 7root.attributes("-topmost", True) 8root.resizable(0,0) 9 10def Syori() : 11 subWindow = tkinter.Toplevel() 12 subWindow.title("タイトル2") 13 subWindow.geometry("250x270") 14 subWindow.attributes("-topmost", True) 15 subWindow.resizable(0,0) 16 17 subWindow.update() # 追加 18 19 time.sleep(10) # 何らかの処理 20 21 subWindow.destroy() 22 23Syori_button = tkinter.Button(text="実行",command=Syori,width=16,height=3) 24Syori_button.place(x=70,y=140) 25 26root.mainloop()

投稿2022/11/08 07:49

can110

総合スコア38256

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

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

ma2222222

2022/11/09 00:15

解決できました!ありがとうございます!
guest

0

tkinterなどのGUIのプログラムは通常1つのプロセスで動作しています。あるタイミングでは1つのことしかできません。そういう中でいろいろな処理をするためにmainloop()があります。
mainloopの中では、イベントの処理やbindされた関数の呼び出し・画面の更新などが順に行なわれています。

イベント処理と画面の更新は別で行なられるので、あるイベント(ボタンを押す)で呼ばれた関数(Syori())で新規ウィンドウを作成しても、そのウィンドウが表示されるのは、その関数が終ってmainloopに戻った後です。
なので、Syori() の中で何か他の処理をしても、それは画面が表示される前に実施されることになります。

投稿2022/11/08 07:39

TakaiY

総合スコア12743

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問