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?

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top