wxProgressDialog喜欢wxDialog的行为

时间:2009-06-17 12:06:23

标签: python wxpython modal-dialog

我想创建模态对话框但不应该以模态方式运行,即控制流应该继续

如果我这样做

 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 个答案:

答案 0 :(得分:1)

只需使用Show代替ShowModal

如果您的函数(print "xxx"部分)运行了很长时间,您将不得不经常手动调用wx.SafeYield或将您的工作移至单独的线程并将自定义事件发送到对话框从它。

还有一个提示。据我所知,你想在显示模态对话框后执行一些代码,这里有一个特殊绑定到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()

答案 1 :(得分:0)

这非常简单,只是在wx.Dialog中使用wx.PD_APP_MODAL样式允许它在不停止程序流的情况下进行模态,只有用户输入到应用程序被阻止,我认为PD_APP_MODAL仅用于进度对话框