comportamento simile a wxProgressDialog per un wxDialog
-
06-07-2019 - |
Domanda
Voglio creare una finestra di dialogo modale ma che non dovrebbe comportarsi in modo modale, vale a dire che il flusso di controllo dovrebbe continuare
se lo faccio
dlg = wx.Dialog(parent)
dlg.ShowModal()
print "xxx"
dlg.Destroy()
" xxx " non verrà stampato, ma in caso di dialogo di avanzamento
dlg = wx.ProgressDialog.__init__(self,title, title, parent=parent, style=wx.PD_APP_MODAL)
print "xxx"
dlg.Destroy()
" xxx " verrà stampato
quindi sostanzialmente voglio ottenere wx.PD__APP__MODAL per una normale finestra di dialogo?
Soluzione 2
È stato molto banale, solo usando lo stile wx.PD_APP_MODAL in wx.Dialog consente di essere modale senza interrompere il flusso del programma, solo l'input dell'utente all'app è bloccato, pensavo che PD_APP_MODAL fosse solo per la finestra di avanzamento
Altri suggerimenti
Usa Show
invece di ShowModal
.
Se la tua funzione (la parte print " xxx "
) funziona a lungo, dovrai chiamare manualmente wx.SafeYield
ogni tanto o spostare il tuo lavorare su un thread separato e inviare eventi personalizzati alla tua finestra di dialogo da esso.
Un altro consiglio. A quanto ho capito, vuoi eseguire un po 'di codice dopo che viene mostrata la finestra di dialogo modale, ecco un piccolo trucco per un legame speciale a EVT_INIT_DIALOG
che compie proprio questo.
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()