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

如果我这样做

 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仅用于进度对话框

其他提示

只需使用 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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top