Вопрос

Я хочу создать модальный диалог, но который не должен вести себя модально, т.е.поток управления должен продолжаться

если я сделаю

 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.PD_APP_MODAL в wx.Dialog позволяет ему работать модально, не останавливая поток программы, блокируется только пользовательский ввод в приложение, я думал, что 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