Как создать циклический модуль, который создает одно окно за раз для каждого результата строки SQL? - PullRequest
1 голос
/ 24 мая 2019

Я создаю программу IP Configuration, где в одной части мне нужно изменить выбранные строки из моей базы данных, чтобы изменить в них информацию.

Чтобы сделать это, мне нужно создать окно в каждой строке, затем подождать, пока пользователь завершит ввод, прежде чем пользователь нажмет следующую, появится новое окно и будет уничтожено старое окно. .

Вот код, который у меня есть для модуля:

class moddtb(wx.Frame):
    def __init__(self, title, parent=None):
        global l_a
        t = len(l_a)
        self.n = 0
        self.b = 0
        while self.n<t:
            while True:
                wx.Frame.__init__(self, parent=parent, title=title, size=(1100, 500))
                panel = wx.Panel(self)
                self.Centre(direction=wx.BOTH)
                self.Bind(wx.EVT_CLOSE, self.cls)
                print(self.n)
                mycursor.execute("SELECT * FROM ip_config WHERE id=%s;", (l_a[self.n],))
                new_ip = mycursor.fetchone()
                self.n_id = str(new_ip[0])
                self.n_hn = str(new_ip[1])
                self.n_rl = str(new_ip[2])
                self.n_aut = str(new_ip[3])
                self.n_ali = str(new_ip[4])
                self.n_typ = str(new_ip[5])
                self.n_env = str(new_ip[6])
                self.n_isc = str(new_ip[7])
                self.n_sta = str(new_ip[8])
                self.n_vla = str(new_ip[9])
                self.n_ip = str(new_ip[10])
                self.n_pui = str(new_ip[11])
                self.n_gri = str(new_ip[12])
                self.n_idr = str(new_ip[13])
                self.n_sys = str(new_ip[14])
                self.n_aps = str(new_ip[15])
                self.n_das = str(new_ip[16])
                self.n_phs = str(new_ip[17])
                self.n_rac = str(new_ip[18])
                self.n_lom = str(new_ip[19])
                self.n_phm = str(new_ip[20])
                self.n_mod = str(new_ip[21])
                self.n_ser = str(new_ip[22])
                self.n_prv = str(new_ip[23])
                self.n_os = str(new_ip[24])
                self.n_war = str(new_ip[25])
                self.n_es = str(new_ip[26])
                self.n_el = str(new_ip[27])
                if self.n_hn is None:
                    wx.MessageBox('An error has been made, selected row %s is empty. Skipping to next row.' % (self.n_id), 'Creation Error', wx.OK | wx.ICON_ERROR)             
                    continue
                f1 = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, "Arial")
                f2 = wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD, False, "Sergoe UI")

                ttllbl = TransparentText(panel, id=wx.ID_ANY, label="Please fill out the information in this form:   ", pos=(60,27),
                                         size=(200,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                ttllbl.SetFont(f2)
                idlbl = TransparentText(panel, id=wx.ID_ANY, label="ID: ", pos=(60,77),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                idlbl.SetFont(f1)
                idtbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_id, pos=(150, 77), size=(180,25), style=wx.TE_READONLY)
                hnlbl = TransparentText(panel, id=wx.ID_ANY, label="Host Name: ", pos=(60,107),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                hnlbl.SetFont(f1)
                self.hntbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_hn, pos=(150, 107), size=(180,25))
                rolelbl = TransparentText(panel, id=wx.ID_ANY, label="Role: ", pos=(60,137),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                rolelbl.SetFont(f1)
                self.roletbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_rl, pos=(150, 137), size=(180,25))
                athlbl = TransparentText(panel, id=wx.ID_ANY, label="Authorize: ", pos=(60,167),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                athlbl.SetFont(f1)
                self.athtbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_aut, pos=(150, 167), size=(180,25))
                alslbl = TransparentText(panel, id=wx.ID_ANY, label="Alias: ", pos=(60,197),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                alslbl.SetFont(f1)
                self.alstbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_ali, pos=(150, 197), size=(180,25))
                typlbl = TransparentText(panel, id=wx.ID_ANY, label="Type: ", pos=(60,227),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                typlbl.SetFont(f1)
                self.typtbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_typ, pos=(150, 227), size=(180,25))
                envlbl = TransparentText(panel, id=wx.ID_ANY, label="Enviroment: ", pos=(60,257),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                envlbl.SetFont(f1)
                self.envtbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_env, pos=(150, 257), size=(180,25))
                isiplbl = TransparentText(panel, id=wx.ID_ANY, label="ISCI IP: ", pos=(60,287),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                isiplbl.SetFont(f1)
                self.isiptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_isc, pos=(150, 287), size=(180,25))
                staiplbl = TransparentText(panel, id=wx.ID_ANY, label="Static IP: ", pos=(60,317),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                staiplbl.SetFont(f1)
                self.staiptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_sta, pos=(150, 317), size=(180,25))
                vliplbl = TransparentText(panel, id=wx.ID_ANY, label="VLAN: ", pos=(60,347),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                vliplbl.SetFont(f1)
                self.vliptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_vla, pos=(150, 347), size=(180,25))

                maniplbl = TransparentText(panel, id=wx.ID_ANY, label="Management IP: ", pos=(360,77),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                maniplbl.SetFont(f1)
                self.maniptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_ip, pos=(500, 77), size=(180,25), style=wx.TE_READONLY)
                pubiplbl = TransparentText(panel, id=wx.ID_ANY, label="Public IP: ", pos=(360,107),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                pubiplbl.SetFont(f1)
                self.pubiptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_pui, pos=(500, 107), size=(180,25))
                grpiplbl = TransparentText(panel, id=wx.ID_ANY, label="Group IP: ", pos=(360,137),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                grpiplbl.SetFont(f1)
                self.grpiptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_gri, pos=(500, 137), size=(180,25))
                idriplbl = TransparentText(panel, id=wx.ID_ANY, label="IDRAC IP: ", pos=(360,167),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                idriplbl.SetFont(f1)
                self.idriptbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_idr, pos=(500, 167), size=(180,25))
                sysszlbl = TransparentText(panel, id=wx.ID_ANY, label="System Size: ", pos=(360,197),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                sysszlbl.SetFont(f1)
                self.syssztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_sys, pos=(500, 197), size=(180,25))
                appszlbl = TransparentText(panel, id=wx.ID_ANY, label="Application Size: ", pos=(360,227),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                appszlbl.SetFont(f1)
                self.appsztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_aps, pos=(500, 227), size=(180,25))
                dtszlbl = TransparentText(panel, id=wx.ID_ANY, label="Data Size: ", pos=(360,257),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                dtszlbl.SetFont(f1)
                self.dtsztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_das, pos=(500, 257), size=(180,25))
                physzlbl = TransparentText(panel, id=wx.ID_ANY, label="Physical Size: ", pos=(360,287),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                physzlbl.SetFont(f1)
                self.physztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_phs, pos=(500, 287), size=(180,25))
                rdconlbl = TransparentText(panel, id=wx.ID_ANY, label="Raid Config: ", pos=(360,317),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                rdconlbl.SetFont(f1)
                self.rdcontbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_rac, pos=(500, 317), size=(180,25))
                lgmemszlbl = TransparentText(panel, id=wx.ID_ANY, label="Logical Memory \nSize: ", pos=(360,347),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                lgmemszlbl.SetFont(f1)
                self.lgmemsztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_lom, pos=(500, 347), size=(180,25))

                phymemszlbl = TransparentText(panel, id=wx.ID_ANY, label="Physical Memory \nSize: ", pos=(700,77),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                phymemszlbl.SetFont(f1)
                self.phymemsztbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_phm, pos=(840, 77), size=(180,25))
                mdllbl = TransparentText(panel, id=wx.ID_ANY, label="Model: ", pos=(700,117),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                mdllbl.SetFont(f1)
                self.mdltbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_mod, pos=(840, 117), size=(180,25))
                srlnumlbl = TransparentText(panel, id=wx.ID_ANY, label="Serial Number: ", pos=(700,147),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                srlnumlbl.SetFont(f1)
                self.srlnumtbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_ser, pos=(840, 147), size=(180,25))
                prvcpulbl = TransparentText(panel, id=wx.ID_ANY, label="Processor/VCPU: ", pos=(700,177),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                prvcpulbl.SetFont(f1)
                self.prvcputbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_prv, pos=(840, 177), size=(180,25))
                oslbl = TransparentText(panel, id=wx.ID_ANY, label="OS: ", pos=(700,207),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                oslbl.SetFont(f1)
                self.ostbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_os, pos=(840, 207), size=(180,25))
                wrtylbl = TransparentText(panel, id=wx.ID_ANY, label="Warranty: ", pos=(700,237),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                wrtylbl.SetFont(f1)
                self.wrtytbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_war, pos=(840, 237), size=(180,25))
                eoslbl = TransparentText(panel, id=wx.ID_ANY, label="End of Support: ", pos=(700,267),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                eoslbl.SetFont(f1)
                self.eostbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_es, pos=(840, 267), size=(180,25))
                eollbl = TransparentText(panel, id=wx.ID_ANY, label="End of Life: ", pos=(700,297),
                                         size=(50,50), style=wx.TRANSPARENT_WINDOW, name='transparenttext')
                eollbl.SetFont(f1)
                self.eoltbx = wx.TextCtrl(panel, id=wx.ID_ANY, value=self.n_el, pos=(840, 297), size=(180,25))
                if self.b==1:
                    b3a = wx.Bitmap("button3 a.png")
                    b3b = wx.Bitmap("button3 b.png")
                    b4a = wx.Bitmap("button4 a.png")
                    b4b = wx.Bitmap("button4 b.png")
                    dtbbtnc = btn.GenBitmapButton(panel, wx.ID_ANY, bitmap=b3a, pos=(700,330),  style=wx.NO_BORDER|wx.BU_EXACTFIT,size=(147, 62))
                    dtbbtnc.SetBitmapSelected(b3b)
                    dtbbtnc.Bind(wx.EVT_BUTTON, self.cc)
                    dtbbtnd = btn.GenBitmapButton(panel, wx.ID_ANY, bitmap=b4a, pos=(880,330),  style=wx.NO_BORDER|wx.BU_EXACTFIT,size=(147, 62))
                    dtbbtnd.SetBitmapSelected(b4b)
                    dtbbtnd.Bind(wx.EVT_BUTTON, self.cls2)
                    self.Show()
                else:
                    b8a = wx.Bitmap("button8 a.png")
                    b8b = wx.Bitmap("button8 b.png")
                    b4a = wx.Bitmap("button4 a.png")
                    b4b = wx.Bitmap("button4 b.png")
                    dtbbtnc = btn.GenBitmapButton(panel, wx.ID_ANY, bitmap=b8a, pos=(880,330),  style=wx.NO_BORDER|wx.BU_EXACTFIT,size=(147, 62))
                    dtbbtnc.SetBitmapSelected(b8b)
                    dtbbtnc.Bind(wx.EVT_BUTTON, self.cc)
                    dtbbtnd = btn.GenBitmapButton(panel, wx.ID_ANY, bitmap=b4a, pos=(700,330),  style=wx.NO_BORDER|wx.BU_EXACTFIT,size=(147, 62))
                    dtbbtnd.SetBitmapSelected(b4b)
                    dtbbtnd.Bind(wx.EVT_BUTTON, self.cls)
                    self.Show()
                if t-1==self.n or t==1:
                    self.b=1
                if moddtb.IsShown(self)==False:
                    break               
            self.n+=1
    def cls2(self, event):
        frame = dspdtb()
        self.Destroy()  
    def cls(self, event):
        nf = MainPage()
        nf.Show()
        self.Destroy()
    def cc(self, event):
        cr_a = self.hntbx.GetValue()
        print ("Value: \"",cr_a,"\"")
        if cr_a != None or cr_a !="" or cr_a !=" " or cr_a !="  " :
            id = self.n_id
            ip = self.n_ip
            cr_b = self.roletbx.GetValue()
            cr_c = self.athtbx.GetValue()
            cr_d = self.alstbx.GetValue()
            cr_e = self.typtbx.GetValue()
            cr_f = self.envtbx.GetValue()
            cr_g = self.isiptbx.GetValue()
            cr_h = self.staiptbx.GetValue()
            cr_i = self.vliptbx.GetValue()
            cr_j = self.pubiptbx.GetValue()
            cr_k = self.grpiptbx.GetValue()
            cr_l = self.idriptbx.GetValue()
            cr_m = self.syssztbx.GetValue()
            cr_n = self.appsztbx.GetValue()
            cr_o = self.dtsztbx.GetValue()
            cr_p = self.physztbx.GetValue()
            cr_q = self.rdcontbx.GetValue()
            cr_r = self.lgmemsztbx.GetValue()
            cr_s = self.phymemsztbx.GetValue()
            cr_t = self.mdltbx.GetValue()
            cr_u = self.srlnumtbx.GetValue()
            cr_v = self.prvcputbx.GetValue()
            cr_w = self.ostbx.GetValue()
            cr_x = self.wrtytbx.GetValue()
            cr_y = self.eostbx.GetValue()
            cr_z = self.eoltbx.GetValue()
            mycursor.execute("UPDATE ip_config SET host_name=%s, role=%s, authorize=%s, alias=%s, type=%s, enviroment=%s, isci_ip=%s, static_ip=%s, vlan=%s, public_ip=%s, group_ip=%s, idrac_ip=%s, system_size=%s, application_size=%s, data_size=%s, physical_size=%s, raid_config=%s, logical_mem=%s, physical_mem=%s, model=%s, serial_number=%s, `processor/vcpu`=%s, os=%s, warranty=%s, end_of_support=%s, end_of_life=%s WHERE id=%s;", (cr_a, cr_b, cr_c, cr_d, cr_e, cr_f, cr_g, cr_h, cr_i, cr_j, cr_k, cr_l, cr_m, cr_n, cr_o, cr_p, cr_q, cr_r, cr_s, cr_t, cr_u, cr_v, cr_w, cr_x, cr_y, cr_z, id))
            if self.b==1:
                LoadThread()
                loada = load()
                loada.ShowModal()
                wx.MessageBox('A new connection has been created, ', 'Connection Created', wx.OK)
            frame = MainPage()
            self.Destroy()      
        else:
            wx.MessageBox('An error has been made, please fill out the host name before you continue...', 'Creation Error', wx.OK | wx.ICON_ERROR)
            frame = MainPage()
            self.Destroy()      

Проблема с этим модулем, однако, две вещи:

  1. Если я запускаю эту программу, происходит бесконечный цикл, что приводит к бесконечному циклу открытых окон.
  2. Даже без странной проблемы с бесконечным циклом, если я исправлю ее, имея в виду только первый цикл, то он будет просто отображать все окна одновременно, а не отображать их одно за другим. Создание путаницы внутри программы.

Есть ли способ отображать окна модификации по одному в строке без необходимости отображать их все сразу?

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2019

Один из способов добиться того, чего вы хотите, - показать каждое окно конфигурации как модальное окно, точно так же, как окно, которое вы получаете при поиске файла (wx.FileDialog).

См. Код (и комментарии) ниже для одного способа сделать это.

Проблема с кодом в том, что он отлично работает только в Windows. В macOS и Linux главное окно отключено не полностью. Например, в macOS вы не можете свернуть и развернуть главное окно, но вы можете взаимодействовать с кнопками; в Linux вы не можете взаимодействовать с кнопками, но вы можете свернуть и развернуть окно. Таким образом, в зависимости от платформ, которые вы хотите поддерживать, вам потребуется немного изменить код.

import wx

class MyFrame(wx.Frame):
    """
    Main Window of the App
    """
    def __init__(self):
        title='Multiple consecutive windows (ShowModal way)'
        super().__init__(None, title=title)

        #### Variables
        # Number of configuration windows that will be created
        self.WinNum = 5
        #### Widgets
        self.panel = wx.Panel(self)
        self.buttonShow = wx.Button(self.panel, pos=(50, 50), label='ShowModal')
        self.buttonTest = wx.Button(self.panel, pos=(50, 100), label='Test')
        #### Bind
        self.buttonShow.Bind(wx.EVT_BUTTON, self.ShowWindows)
        #### Position of the window
        self.SetPosition(pt=(50, 50))

    def ShowWindows(self, event):
        """
        This will create the configuration windows as modal windows. 
        """
        i = 0
        # This is to show a way to pass information from the configuration
        # windows to the main window. Just in case.
        self.configResults = []

        #### Depending of the OS you want to support you will need to modify the
        #### this window as explained in the answer. For macOS at least the 
        #### ShowModal button must be disable to avoid launching parallel 
        #### configuration windows. Remove the comment in the line below
        #self.buttonShow.Disable()

        while i < self.WinNum:
            a = WinModal(i)
            a.ShowModal()
            i += 1

        #### After all windows are closed the button must be enable again in
        #### macOS. Remove the comment in the line below.
        #self.buttonShow.Enable()

        #### Check that the information was passed 
        print(self.configResults)

class WinModal(wx.Frame):
    """
    Configuration window
    """ 
    def __init__(self, ThisWinNum):
        title = 'This is window number: ' + str(ThisWinNum)
        super().__init__(None, title=title)
        #### Variables
        self.ThisWinNum = ThisWinNum
        # To append Cancel when closing the configuration window without 
        # clicking Ok
        self.cancel = True
        #### Widgets
        self.panel = wx.Panel(self)
        self.buttonOk = wx.Button(self.panel, pos=(50, 50), label='Ok')
        #### Positions
        self.SetPosition(pt=(200, 200))
        #### Bind
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Bind(wx.EVT_BUTTON, self.onOk)

    def ShowModal(self):
        """
        This function is the one giving the wx.FileDialog behavior
        """
        self._disabler = wx.WindowDisabler(self)
        self.Show()
        self.eventLoop = wx.GUIEventLoop()
        self.eventLoop.Run()

    def OnClose(self, event):
        """
        To handle closing the windows because you need to exit the eventLoop
        of the modal window.
        """
        if self.cancel:
            frame.configResults.append('Cancel')
        else:
            pass

        del self._disabler
        self.eventLoop.Exit()
        self.Destroy()

    def onOk(self, event):
        """ 
        Do your configuration and exit by calling self.OnClose. You will need 
        something similar if you place a Cancel button in the configuration 
        windows.
        """
        print(self.ThisWinNum)
        # Pass the informartion to the main window
        frame.configResults.append(self.ThisWinNum)
        # To avoid append when Ok is clicked
        self.cancel = False
        self.OnClose(event)

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
else:
    pass
...