wxDialog 类似 wxProgressDialog 的行为设置
我想创建一个弹出对话框,但它不应该像普通的弹出框那样工作,也就是说,程序的执行流程应该继续进行。
如果我这样做:
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 个回答
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()
0
这其实很简单,只要在wx.Dialog中使用wx.PD_APP_MODAL这个样式,就可以让对话框变成模态对话框,而不会阻止程序的运行。这样的话,只有用户对应用的输入会被阻止。我原以为PD_APP_MODAL只是用在进度对话框上。