wxDialogのwxProgressDialogのような動作
-
06-07-2019 - |
質問
モーダルダイアログを作成したいが、モーダルな方法で動作するべきではありません。つまり、制御フローを続行する必要があります
する場合
dlg = wx.Dialog(parent)
dlg.ShowModal()
print "xxx"
dlg.Destroy()
" xxx"印刷されませんが、進行状況ダイアログの場合
dlg = wx.ProgressDialog.__init__(self,title, title, parent=parent, style=wx.PD_APP_MODAL)
print "xxx"
dlg.Destroy()
" xxx"印刷されます
だから基本的に私は通常のダイアログでwx.PD__APP__MODALを達成したいですか
解決 2
これは非常に簡単で、wx.Dialogでwx.PD_APP_MODALスタイルを使用するだけで、プログラムフローを停止せずにモーダルにすることができ、アプリへのユーザー入力のみがブロックされます。PD_APP_MODALは進行状況ダイアログ専用です
他のヒント
ShowModal
の代わりに Show
を使用します。
関数( print" xxx"
部分)が長時間実行される場合、 wx.SafeYield
を頻繁に手動で呼び出すか、別のスレッドで動作し、そこからダイアログにカスタムイベントを送信します。
もう1つのヒント。私が理解しているように、モーダルダイアログが表示された後にいくつかのコードを実行する必要があります。これを実現する EVT_INIT_DIALOG
への特別なバインドのちょっとしたコツです。
import wx
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
btn = wx.Button(self, label="Show Dialog")
btn.Bind(wx.EVT_BUTTON, self.ShowDialog)
def ShowDialog(self, event):
dlg = wx.Dialog(self)
dlg.Bind(wx.EVT_INIT_DIALOG, lambda e: wx.CallAfter(self.OnModal, e))
dlg.ShowModal()
dlg.Destroy()
def OnModal(self, event):
wx.MessageBox("Executed after ShowModal")
app = wx.PySimpleApp()
app.TopWindow = TestFrame()
app.TopWindow.Show()
app.MainLoop()
所属していません StackOverflow