wxProgressDialog comme comportement pour un wxDialog
-
06-07-2019 - |
Question
Je veux créer un dialogue modal mais qui ne devrait pas se comporter de manière modale, c'est-à-dire que le flux de contrôle devrait continuer
si je le fais
dlg = wx.Dialog(parent)
dlg.ShowModal()
print "xxx"
dlg.Destroy()
& xxx " ne sera pas imprimé, mais en cas de dialogue de progression
dlg = wx.ProgressDialog.__init__(self,title, title, parent=parent, style=wx.PD_APP_MODAL)
print "xxx"
dlg.Destroy()
& xxx " sera imprimé
donc en gros je veux atteindre wx.PD__APP__MODAL pour un dialogue normal?
La solution 2
C’était très simple, utiliser le style wx.PD_APP_MODAL dans wx.Dialog lui permet d’être modal sans arrêter le déroulement du programme, seule la saisie de l’utilisateur sur l’app est bloquée.
Autres conseils
Utilisez simplement Show
au lieu de ShowModal
.
Si votre fonction (la partie print "xxx"
) est exécutée pendant longtemps, vous devrez soit appeler manuellement wx.SafeYield
, soit déplacer votre travaillez sur un thread séparé et envoyez des événements personnalisés à votre boîte de dialogue à partir de celle-ci.
Un autre conseil. Si je comprends bien, vous souhaitez exécuter du code une fois que la boîte de dialogue modale est affichée. Voici un petit truc pour une liaison spéciale à EVT_INIT_DIALOG
qui accomplit exactement cela.
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()