Como fazer um wxFrame se comportar como um objeto wxDialog modal

votos
8

Será que é possível fazer um objeto wxFrame se comportam como uma caixa de diálogo modal em que a janela de criar o objeto wxFrame pára a execução até que as saídas de objetos wxFrame?

Eu estou trabalhando em um jogo pequeno e ter executado no seguinte problema. Eu tenho uma janela principal do programa que hospeda o aplicativo principal (parte estratégica). Ocasionalmente, eu preciso transferir o controle para uma segunda janela para a resolução de parte do jogo (parte tática). Enquanto na segunda janela, eu quero o processamento na primeira janela para parar e aguardar a conclusão do trabalho que está sendo feito na segunda janela.

Normalmente, um diálogo modal faria o truque, mas eu quero a nova janela para ter alguma funcionalidade que eu não consigo ficar com uma wxDialog, ou seja, uma barra de status na parte inferior e a capacidade de redimensionar / maximizar / minimizar a janela (esta deve ser possível, mas não funciona, consulte esta pergunta Como obter a minimizar e maximizar botões para aparecer em um objeto wxDialog ).

Como uma nota disso, eu quero a funcionalidade da segunda janela precisa ficar completamente dissociada da janela principal, pois ela será desmembrada em um programa separado, eventualmente.

Alguém já fez isso ou tem alguma sugestão?

Publicado 19/05/2009 em 16:35
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Eu também estava à procura de uma solução semelhante e comeup com esta solução, criar um quadro, desativar outras janelas fazendo frame.MakeModal () e parar de início de execução e ciclo de eventos depois de mostrar quadro, e quando quadro é de saída fechado o ciclo de eventos, por exemplo I aqui é exemplo usando wxpython mas deve ser semelhante em wxWidgets.

import wx

class ModalFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, style=wx.DEFAULT_FRAME_STYLE|wx.STAY_ON_TOP)

        btn = wx.Button(self, label="Close me")
        btn.Bind(wx.EVT_BUTTON, self.onClose)
        self.Bind(wx.EVT_CLOSE, self.onClose) # (Allows main window close to work)

    def onClose(self, event):
        self.MakeModal(False) # (Re-enables parent window)
        self.eventLoop.Exit()
        self.Destroy() # (Closes window without recursion errors)

    def ShowModal(self):
        self.MakeModal(True) # (Explicit call to MakeModal)
        self.Show()

        # now to stop execution start a event loop 
        self.eventLoop = wx.EventLoop()
        self.eventLoop.Run()


app = wx.PySimpleApp()
frame = wx.Frame(None, title="Test Modal Frame")
btn = wx.Button(frame, label="Open modal frame")

def onclick(event):
    modalFrame = ModalFrame(frame, "Modal Frame")
    modalFrame.ShowModal()
    print "i will get printed after modal close"

btn.Bind(wx.EVT_BUTTON, onclick)

frame.Show()
app.SetTopWindow(frame)
app.MainLoop()
Respondeu 04/04/2010 em 06:26
fonte usuário

votos
3

Realmente não faz sentido "parar a execução" de uma janela, como a janela só trata os eventos que são enviados para ele, como para eventos exemplo mouse, teclado ou pintura, e ignorá-los seria fazer o programa aparecem pendurados. O que você deve fazer é desabilitar todos os controles em seu quadro, isso vai cinza-los e fazer o usuário consciente do fato de que eles não podem ser interagiu com neste momento.

Você também pode desativar o quadro pai completamente, em vez de desabilitar todos os controles sobre ele. Olhe para o wxWindowDisabler classe, o construtor tem um parâmetro para indicar uma janela que pode ser interagido com, e todas as outras janelas do aplicativo será desativado.

Se você mais tarde deseja executar um programa secundário, em seguida, você poderia usar o wxExecute () função para fazê-lo.

Respondeu 19/05/2009 em 18:57
fonte usuário

votos
1

Isso levou-me uma quantidade irritante de tempo para descobrir, mas aqui está um exemplo de trabalho que cresceu a partir do exemplo de Anurag:

import wx

class ChildFrame(wx.Frame):
    ''' ChildFrame launched from MainFrame '''
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, -1,
                          title=self.__class__.__name__,
                          size=(300,150))

        panel = wx.Panel(self, -1)
        closeButton = wx.Button(panel, label="Close Me")

        self.Bind(wx.EVT_BUTTON, self.__onClose, id=closeButton.GetId())
        self.Bind(wx.EVT_CLOSE, self.__onClose) # (Allows frame's title-bar close to work)

        self.CenterOnParent()
        self.GetParent().Enable(False)
        self.Show(True)

        self.__eventLoop = wx.EventLoop()
        self.__eventLoop.Run()

    def __onClose(self, event):
        self.GetParent().Enable(True)
        self.__eventLoop.Exit()
        self.Destroy()

class MainFrame(wx.Frame):
    ''' Launches ChildFrame when button is clicked. '''
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id,
                          title=self.__class__.__name__,
                          size=(400, 300))

        panel = wx.Panel(self, -1)
        launchButton = wx.Button(panel, label="launch modal window")

        self.Bind(wx.EVT_BUTTON, self.__onClick, id=launchButton.GetId())

        self.Centre()
        self.Show(True)

    def __onClick(self, event):
        dialog = ChildFrame(self, -1)
        print "I am printed by MainFrame and get printed after ChildFrame is closed"

if __name__ == '__main__':
    app = wx.App()    
    frame = MainFrame(None, -1)
    frame.Show()
    app.MainLoop()
Respondeu 26/01/2015 em 20:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more