【wxPython】プログレスダイアログを閉じたらなぜか後ろ(背面)にいく問題に悩んだ話 | wx.ProgressDialog

2025年3月26日水曜日

Python wxPython

t f B! P L
 wxPythonにはwx.ProgressDialogというものがあります。
このダイアログは時間がかかる処理を行うときに、その進捗を表示するものです。

例えばですが、アプリの起動時に様々なものをインポートする必要があり、その進捗をプログレスダイアログで表示、終わったらそのダイアログを閉じてメインウィンドウを表示するといったものがあると思います。

ちょっと雑にコードを書いてみましたが、こんなものでしょうか。

import wx
import time

app = wx.App(0)
dialog = wx.ProgressDialog("あー","",maximum=100)
dialog.Show()
time.sleep(1)
dialog.Update(20)
time.sleep(3)
dialog.Update(80)
time.sleep(2)
dialog.Update(90)
time.sleep(1)
dialog.Destroy()
frame = wx.Frame(None,-1,"メインフレームです")
frame.Show(True)
app.MainLoop()

非常に適当に作ったので何がしたいのかわからないただの遅延行為ですが、こういうものだったとします。
それにしても、ProgressDialogだとなぜかtime.sleep処理を行っても応答なしを回避できるんですよね。

しかし、これで実行すると、後から出てくるメインウィンドウがなぜか後ろ(背面)にいってしまいます。
流れとしては以下のような感じ。


プログレスダイアログが出てくる。

なぜか背面にいってしまう。

これには頭を抱えましたね。ShowModal()とかダイアログのstyle変更とか試してみましたが、この問題は解決されず、、
ただ、その原因は意外と単純なものでして、

parentを指定してねーぞ!!

というものでした。
ダイアログなのに、親ウィンドウを指定してないからこういうことになるのでしょうか。
仕方ないのでwx.Frameの初期化を、ダイアログを表示する前にしておきます。

するとコードはこんな感じになるでしょうか。

import wx
import time

app = wx.App(0)
frame = wx.Frame(None,-1,"メインフレームです")
dialog = wx.ProgressDialog("あー","",maximum=100,parent=frame)
dialog.Show()
time.sleep(1)
dialog.Update(20)
time.sleep(3)
dialog.Update(80)
time.sleep(2)
dialog.Update(90)
time.sleep(1)
dialog.Destroy()
frame.Show(True)
app.MainLoop()


無事前面にでた。

ということで割と単純な原因で、「parent(親ウィジェット)を指定していないから」でした。日本語で検索しても出てこなかった(そのそのこんなこと誰も調べないか)ので今回は書いてみいました。解決には英語で検索したら出てきた以下を参考にさせていただきました


もうすぐ3月も終わり4月になりますね。
私もJK(情報系高専生)2年生になります。
ちなみに4月からはアニメ、Summer Pocketsがはじまるので楽しみです。
原作をやってたわけではありませんが、Keyのアニメということで。

ではでは。

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ