wxDialog 类似 wxProgressDialog 的行为设置

0 投票
2 回答
1050 浏览
提问于 2025-04-15 12:18

我想创建一个弹出对话框,但它不应该像普通的弹出框那样工作,也就是说,程序的执行流程应该继续进行。

如果我这样做:

 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只是用在进度对话框上。

撰写回答