Поведение wxProgressDialog для wxDialog
-
06-07-2019 - |
Вопрос
Я хочу создать модальный диалог, но который не должен вести себя модально, т.е.поток управления должен продолжаться
если я сделаю
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()