如何隐藏wx.Dialog(为什么.Hide()不起作用)?

时间:2019-02-05 07:31:12

标签: python dialog wxpython pyserial

我的问题是按OK时如何隐藏wx.Dialog?我尝试过

  

wx.Dialog.Destroy(),

     

wx.Dialog.Close()和

     

wx.Dialog.Hide()

所有人都关闭了我的wx.Dialog。我试图按OK,然后打开框架或面板(我确实需要关闭对话框。否则在对话框中,我可以打开框架/面板)。

不胜感激。

def OnOK(self, event):
    global ser
    success = True
    self.serial.port = self.ports[self.choice_port.GetSelection()]                 
    if self.show & SHOW_BAUDRATE: 
        try: 
            b = int(self.combo_box_baudrate.GetValue()) 
        except ValueError: 
            with wx.MessageDialog(self, 'Baudrate must be a numeric value', 'Value Error', wx.OK | wx.ICON_ERROR) as dlg:
                dlg.ShowModal()   
            success = False          
        else: 
            self.serial.baudrate = b

    a = self.serial.port
    b = self.serial.baudrate
    ser = serial.Serial('{}'.format(a),'{}'.format(b)) 
    print(a,b) 

    #self.connected=True

    if success:
        self.EndModal(wx.ID_OK)
        #wx.Dialog.Destroy(self)
        #wx.Dialog.Close(self)  
        #wx.Dialog.Hide(self) 

如有必要,整个代码为:

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

import wx
import serial
import serial.tools.list_ports

SHOW_BAUDRATE = 1 << 0
SHOW_FORMAT = 1 << 1 
SHOW_ALL = SHOW_BAUDRATE | SHOW_FORMAT 
class SerialConfigDialog(wx.Dialog):

    def __init__(self, parent, *args, **kwds):
        self.serial = kwds['serial']
        del kwds['serial']
        self.show = SHOW_ALL
        if 'show' in kwds:
            self.show = kwds.pop('show')
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE


        wx.Dialog.__init__(self, parent, size = ( 700,500 ),*args, **kwds)
        #wx.Frame.__init__(self, parent, *args, **kwds)
        #Dialog(parent, id=ID_ANY, title="", pos=DefaultPosition, size=DefaultSize, style=DEFAULT_DIALOG_STYLE, name=DialogNameStr)

        self.label_2 = wx.StaticText(self, -1, "Port")
        self.choice_port = wx.Choice(self, -1, choices=[])
        self.label_1 = wx.StaticText(self, -1, "Baudrate")
        self.combo_box_baudrate = wx.ComboBox(self, -1, choices=[], style=wx.CB_DROPDOWN)
        self.sizer_1_staticbox = wx.StaticBox(self, -1, "Basics")
        self.button_ok = wx.Button(self, wx.ID_OK, "")
        self.button_cancel = wx.Button(self, wx.ID_CANCEL, "")
        #self.__set_properties()
        #self.__do_layout()
        #self.__attach_events()

    #def __set_properties(self):
        self.SetTitle("Serial Port Configuration")
        self.button_ok.SetDefault()
        self.SetTitle("Serial Port Configuration")
        self.button_ok.SetDefault()
        preferred_index = 0
        self.choice_port.Clear()
        self.ports = []
        self.connected = False
        for n, (portname, desc, hwid) in enumerate(sorted(serial.tools.list_ports.comports())):
            self.choice_port.Append(u'{} - {}'.format(portname, desc))
            self.ports.append(portname)
            if self.serial.name == portname:
                preferred_index = n
        self.choice_port.SetSelection(preferred_index)
        if self.show & SHOW_BAUDRATE:
            preferred_index = None
            self.combo_box_baudrate.Clear()
            for n, baudrate in enumerate(self.serial.BAUDRATES):
                self.combo_box_baudrate.Append(str(baudrate))
                if self.serial.baudrate == baudrate:
                    preferred_index = n
            if preferred_index is not None:
                self.combo_box_baudrate.SetSelection(preferred_index)
            else:
                self.combo_box_baudrate.SetValue(u'{}'.format(self.serial.baudrate))

    #def __do_layout(self):
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        grid_sizer_1 = wx.FlexGridSizer(3, 2, 0, 0)
        self.sizer_1_staticbox.Lower()
        sizer_1 = wx.StaticBoxSizer(self.sizer_1_staticbox, wx.VERTICAL)

        sizer_basics = wx.FlexGridSizer(3, 2, 0, 0)
        sizer_basics.Add(self.label_2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 4)
        sizer_basics.Add(self.choice_port, 0, wx.EXPAND, 0)
        sizer_basics.Add(self.label_1, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 4)
        sizer_basics.Add(self.combo_box_baudrate, 0, wx.EXPAND, 0)
        sizer_basics.AddGrowableCol(1)

        sizer_1.Add(sizer_basics, 0, wx.EXPAND, 0)
        sizer_2.Add(sizer_1, 0, wx.EXPAND, 0)
        sizer_3.Add(self.button_ok, 0, 0, 0)
        sizer_3.Add(self.button_cancel, 0, 0, 0)
        self.m_button26 = wx.Button( self, wx.ID_ANY, u"Back", wx.DefaultPosition, wx.DefaultSize, 0 )
        sizer_3.Add( self.m_button26, 0, 0, 0 )
        sizer_2.Add(sizer_3, 0, wx.ALL | wx.ALIGN_RIGHT, 4)

        self.SetSizer(sizer_2)
        #sizer_2.Fit(self)  ### for no-resize
        self.Layout()

    #def __attach_events(self):
        wx.EVT_BUTTON(self, self.button_ok.GetId(), self.OnOK)
        wx.EVT_BUTTON(self, self.button_cancel.GetId(), self.OnCancel)
        self.m_button26.Bind( wx.EVT_BUTTON, self.back__f )

    def OnOK(self, event):
        global ser
        success = True
        self.serial.port = self.ports[self.choice_port.GetSelection()]                 
        if self.show & SHOW_BAUDRATE: 
            try: 
                b = int(self.combo_box_baudrate.GetValue()) 
            except ValueError: 
                with wx.MessageDialog(self, 'Baudrate must be a numeric value', 'Value Error', wx.OK | wx.ICON_ERROR) as dlg:
                    dlg.ShowModal()   
                success = False          
            else: 
                self.serial.baudrate = b

        a = self.serial.port
        b = self.serial.baudrate
        ser = serial.Serial('{}'.format(a),'{}'.format(b)) 
        print(a,b) 

        #self.connected=True

        if success:
            print("1")
            #self.EndModal(wx.ID_OK)
            wx.Dialog.Hide(self)

            #wx.Dialog.Destroy(self)
            #wx.Dialog.Close(self)  
            #wx.Dialog.Hide(self) 


    def OnCancel(self, events):
        self.EndModal(wx.ID_CANCEL)

    def back__f( self, event ):        
        self.a = MyFrame4( self )
        self.a.Show()

class MyApp(wx.App):

    def OnInit(self):
        wx.InitAllImageHandlers()
        ser = serial.Serial()
        for flags in (SHOW_BAUDRATE, SHOW_FORMAT, SHOW_ALL):
            dialog_serial_cfg = SerialConfigDialog(None, -1, "", serial=ser, show=flags)

            self.SetTopWindow(dialog_serial_cfg)
            result = dialog_serial_cfg.ShowModal()

            if result != wx.ID_OK:
                break 
        return 0     


if __name__ == "__main__": 
    app = MyApp(0)
    app.MainLoop() 

1 个答案:

答案 0 :(得分:0)

您需要在self.Destroy()子类中使用wx.Dialog。您不能直接调用wx.Dialog.Destroy或任何其他方法。相反,您必须始终使用self.MethodName()