Logo Hardware.com.br
urbanus
urbanus Super Participante Registrado
518 Mensagens 53 Curtidas

[Resolvido] Ajuda em código wxPython.

#1 Por urbanus 21/03/2012 - 18:45
Estou construindo um aplicativo, uma agenda de consultas, Python, wxPython, com banco de dados MySQL.
No snapshot abaixo, tenho a janela principal com o corpo da agenda. Ao selecionar um paciente, em seguida no botão situação, uma nova janela surge, com opções para alterar a situação do atendimento.
http://img441.imageshack.us/img441/1459/snapshotj.png

Uploaded with ImageShack.us
Quando a segunda janela se abre o foco se volta para ela, enquanto a janela principal fica indisponível, até o fechamento da filha.

self.frame_situacao = wx.Frame(self, -1, title="Situação", size=(230, 400), style=wx.STAY_ON_TOP) #Constroi a janela situação
self.frame_situacao.Show(True) # Mostra a janela
self.frame_situacao.MakeModal(True) # O loop de eventos continua trabalhando, com o foco na nova janela secundária, enquanto a primária fica indisponível.
Tive que utilizar esse artifício para permitir apenas uma instância da nova janela. Sem ele, caso o usuário clicasse mais de uma vez sobre o botão "Situação", abria mais de uma instância.
O problema é o seguinte, como permitir apenas uma instância de uma janela sem o recurso de torná-la modal? Gostaria que o usuário pudesse interagir com a janela principal, tendo apenas uma instância de outra janela aberta.
Espero ter sido claro.
urbanus
urbanus Super Participante Registrado
518 Mensagens 53 Curtidas
#2 Por urbanus
27/03/2012 - 19:22
Fuçando na Internet descobri que existe uma classe no wxPython, wx.SingleInstanceChecker que faz o serviço. Um exemplo de código:

#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import wx

class MeuFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(300, 300))
self.Centre()


class UnicoApp(wx.App):
def OnInit(self):
self.nome = "MeuFrame-%s" % wx.GetUserId()
self.instance = wx.SingleInstanceChecker(self.nome)
if self.instance.IsAnotherRunning():
wx.MessageBox("Outra instância do frame em execução", "ERRO!&quot
return False
else:
frame = MeuFrame(None, "Frame de instância única&quot
frame.Show()
return True


app = UnicoApp(redirect=False)
app.MainLoop()
Vendo câmera Nikon D3000, pouco uso, lente 18-55mm, por R$ 800,00 + frete.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal