在Python中修改wxDialog中wxTextCtrl的值

时间:2013-01-12 20:10:09

标签: python class wxpython

我有以下代码:

import wx

class CotizadorWindow(wx.Frame):
    def __init__(self):
        super(CotizadorWindow,self).__init__(None)
        self.CreateInteriorWindowComponents()

        self.SetTitle(u"Cotizador")

   def CreateInteriorWindowComponents(self):
       self.hbox=wx.BoxSizer(wx.VERTICAL)
       self.panel1=wx.Panel(self,-1,style=wx.SIMPLE_BORDER)
       self.SetSizer(self.hbox)
       self.Centre()
       self.hbox.Add(self.panel1,1,wx.EXPAND|wx.ALL,3)


       wx.StaticText(self.panel1,label=u"Cotización", pos=(10,10))
       self.bxCotizacion=wx.TextCtrl(self.panel1,size=(80,-1),pos=(80,8))


       self.btnAltaCliente=wx.Button(self.panel1,label='Alta cliente', pos=(100,37))
       self.btnAltaCliente.Bind(wx.EVT_BUTTON,self.Alta)


    def Alta(self,event):
        altacliente=DlgAltaCliente(None, title='Nuevo Cliente')
        altacliente.ShowModal()
        altacliente.Destroy()

    def ClearCliente2(self):
        self.bxCotizacion.Value='1'


class DlgAltaCliente (wx.Dialog):
    def __init__(self,*args,**kw):
        super(DlgAltaCliente,self).__init__(*args,**kw)

        self.InitUI()
        self.SetSize((200,200))
        self.SetTitle("Alta de Cliente")

    def InitUI(self):
        pnl=wx.Panel(self)
        vbox=wx.BoxSizer(wx.VERTICAL)

        hbox=wx.BoxSizer(wx.HORIZONTAL)
        okButton=wx.Button(self,label='OK')
        closeButton=wx.Button(self,label='Cancelar')
        hbox.Add(okButton)
        hbox.Add(closeButton, flag=wx.LEFT,border=5)

        vbox.Add(pnl,proportion=1, flag=wx.ALL|wx.EXPAND,border=5)
        vbox.Add(hbox,flag=wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, border=10)

        self.SetSizer(vbox)
        okButton.Bind(wx.EVT_BUTTON,self.EvtGuardarCliente)
        closeButton.Bind(wx.EVT_BUTTON,self.EvtOnClose)

    def EvtGuardarCliente(self,event):

        self.Destroy()
        cotizador=CotizadorWindow()
        cotizador.ClearCliente2()

   def EvtOnClose(self,event):
       self.Destroy()


app=wx.App()
frame=CotizadorWindow()
frame.Show()
frame.Maximize()
app.MainLoop()   

在第二类我创建一个对话框,关闭后,对话框的信息应该转移到第一类组件中的组件。它不起作用。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您的问题是,在ok情况的事件处理程序中,您正在创建CortizadorWindow的新实例,而不是访问已经实例化的实例。

答案 1 :(得分:0)

对话框的“确定”和“取消”按钮无需使用事件处理程序。只需使用股票ID wx.ID_OK和wx.ID_CANCEL这些按钮,默认处理程序将为您做正确的事情,包括验证对话框控件是否有验证器,然后调用EndModal。

然后在创建和显示对话框的代码中,典型的使用模式是这样的:

def Alta(self,event):
    altacliente=DlgAltaCliente(None, title='Nuevo Cliente')
    if altacliente.ShowModal() == wx.ID_OK:
        # fetch values from the dialog
        self.someValue = altacliente.getSomeValue()
    altacliente.Destroy()

使用对话框作为上下文管理器也是可能的,它会在完成后自动调用Destroy:

def Alta(self, event):
    with DlgAltaCliente(None, title='Nuevo Cliente') as dlg:
        if dlg.ShowModal() == wx.ID_OK:
            # do something with dlg values...