Search code examples
python-2.7wxpython

Python WX calling child frames from parent frame


i am making app that will interact whit MySQL databases, to one table to bee precise. I create main frame, and 3 more, one to show table, one to insert data, and one to delete row using id key. When i start index.py all 3 scripts run, and then main window. I want to user call scripts from menu.

Here is the script:

import wx
from main import SetupGrid
from insert import InsertData
from delete import DeleteData

class GlavniProzor(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Editor Tabele Setup", size = (800,600))
        self.createMenu()
        self.CenterOnScreen()
        self.Show()

    def createMenu(self):
        ''' Traka menija '''
        menubar = wx.MenuBar()
        self.SetMenuBar(menubar)

        ''' Meni Specijalne funkcije '''
        menu = wx.Menu()
        menubar.Append(menu, '&Specijalne funkcije')
        menuitem = wx.MenuItem(menu, wx.ID_ANY, 'Tabela')
        #self.Bind(wx.EVT_MENU, self.prikazTabele, menuitem)
        menu.AppendItem(menuitem)
        menuitem = wx.MenuItem(menu, wx.ID_ANY, 'Unos u tabelu')
        # self.Bind(wx.EVT_MENU, self.unosuTabelu, menuitem)
        menu.AppendItem(menuitem)
        menuitem = wx.MenuItem(menu, wx.ID_ANY, 'Brisanje iz tabele')
        # self.Bind(wx.EVT_MENU, self.brisanjeizTabele, menuitem)
        menu.AppendItem(menuitem)
        menuitem = wx.MenuItem(menu, wx.ID_ANY, 'Izlaz')
        # self.Bind(wx.EVT_MENU, self.izlaz, menuitem)
        menu.AppendItem(menuitem)

    def prikazTabele(self, evt):
        dial = SetupGrid(self, -1)
        dial.CenterOnParent()
        dial.Show()

    def unosuTabelu(self, evt):
        dial = InsertData(self, -1)
        dial.CenterOnParent()
        dial.Show()

    def brisanjeizTabele(self, evt):
        dial = DeleteData(self, -1)
        dial.CenterOnParent()
        dial.Show()

    def izlaz(self, evt):
        exit()



app = wx.App(0)
frame = GlavniProzor(None)
app.MainLoop()

This is main.py scrip, which show table

#! /usr/bin/env python
import wx, MySQLdb, wx.lib.intctrl
import  wx.grid as gridlib

ID_SETUP = 1

db = MySQLdb.connect("127.0.0.1", "user", "password", "database")


class SetupGrid(wx.Dialog):
    def __init__(self, id, title='Tabela Setup'):
        wx.Dialog.__init__(self, id, title, size=(1000, 300))

        db = MySQLdb.connect("127.0.0.1", "root", "aaa111bbb", "mysqlsetup")
        cursor = db.cursor()

        def setupid():
            sql = 'SELECT idSetup FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupkomitent():
            sql = 'SELECT idKomitent FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupdrzava():
            sql = 'SELECT Drzava FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupprg():
            sql = 'SELECT Prg FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupprovajder():
            sql = 'SELECT Provajder FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupservername():
            sql = 'SELECT ServerName FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupdatabasename():
            sql = 'SELECT DataBaseName FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setupsifarnici():
            sql = 'SELECT Sifarnici FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2

        def setuppromena():
            sql = 'SELECT Promena FROM setup'
            cursor.execute(sql)
            rezltat = cursor.fetchall()
            rezultat2 = []
            x = 0
            for upis in rezltat:
                for polje in upis:
                    users = str(polje)
                    rezultat2.append(users)
                    x += 1
            return rezultat2



        self.idSetup = setupid()
        self.idKomitent = setupkomitent()
        self.Drzava = setupdrzava()
        self.Prg = setupprg()
        self.Provajder = setupprovajder()
        self.ServerName = setupservername()
        self.DataBaseName = setupdatabasename()
        self.Sifarnici = setupsifarnici()
        self.Promena = setuppromena()

        # Define main panel
        panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        # Define sizers
        # Horizontal sizers
        SetupTableSizer = wx.BoxSizer(wx.HORIZONTAL)
        BtnSizer = wx.BoxSizer(wx.HORIZONTAL)
        # Add species table widget
        Setup = wx.grid.Grid(panel, -1, size=(1070, 200))
        Setup.CreateGrid(9, 9)
        Setup.SetColLabelValue(0, "idSetup")
        Setup.SetColLabelValue(1, "idKomitent")
        Setup.SetColLabelValue(2, "Drzava")
        Setup.SetColLabelValue(3, "Prg")
        Setup.SetColLabelValue(4, "Provajder")
        Setup.SetColLabelValue(5, "ServerName")
        Setup.SetColLabelValue(6, "DataBaseName")
        Setup.SetColLabelValue(7, "Sifarnici")
        Setup.SetColLabelValue(8, "Promena")
        Setup.SetRowLabelSize(0)

        for i in range(0, len(self.idSetup)):
            Setup.SetCellValue(i, 0, self.idSetup[i])
        for i in range(0, len(self.idKomitent)):
            Setup.SetCellValue(i, 1, self.idKomitent[i])
        for i in range(0, len(self.Drzava)):
            Setup.SetCellValue(i, 2, self.Drzava[i])
        for i in range(0, len(self.Prg)):
            Setup.SetCellValue(i, 3, self.Prg[i])
        for i in range(0, len(self.Provajder)):
            Setup.SetCellValue(i, 4, self.Provajder[i])
        for i in range(0, len(self.ServerName)):
            Setup.SetCellValue(i, 5, self.ServerName[i])
        for i in range(0, len(self.DataBaseName)):
           Setup.SetCellValue(i, 6, self.DataBaseName[i])
        for i in range(0, len(self.Sifarnici)):
            Setup.SetCellValue(i, 7, self.Sifarnici[i])
        for i in range(0, len(self.Promena)):
            Setup.SetCellValue(i, 8, self.Promena[i])
            Setup.AutoSize()
        SetupTableSizer.Add(Setup, wx.ALIGN_CENTER | wx.ALL, 0)

        panel.SetSizer(vbox)
        self.Centre()
        self.Show(True)



app = wx.App()
SetupGrid(None, -1)
app.MainLoop()

This is insert script

import wx
import MySQLdb

db = MySQLdb.connect("127.0.0.1", "user", "password", "database")
cursor = db.cursor()


class InsertData(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        panel = wx.Panel(self, -1)
        panel.SetBackgroundColour('light gray')
        #iconFile = "Grocery.ico"
        #icon1 = wx.Icon(iconFile, wx.BITMAP_TYPE_ICO)
        #self.SetIcon(icon1)
        label1 = wx.StaticText(panel, -1, "idKomitent:")
        label2 = wx.StaticText(panel, -1, "Drzava:")
        label3 = wx.StaticText(panel, -1, "Prg:")
        label4 = wx.StaticText(panel, -1, "Provajder:")
        label5 = wx.StaticText(panel, -1, "ServerName:")
        label6 = wx.StaticText(panel, -1, "DataBaseName:")
        label7 = wx.StaticText(panel, -1, "Sifarnici:")
        self.idKomitent = wx.TextCtrl(panel, -1, "")
        self.Drzava = wx.TextCtrl(panel, -1, "")
        self.Prg = wx.TextCtrl(panel, -1, "")
        self.Provajder = wx.TextCtrl(panel, -1, "")
        self.ServerName = wx.TextCtrl(panel, -1, "")
        self.DataBaseName = wx.TextCtrl(panel, -1, "")
        self.Sifarnici = wx.TextCtrl(panel, -1, "")
        self.calc_btn = wx.Button(panel, -1, 'Insert')
        self.calc_btn.Bind(wx.EVT_BUTTON, self.onEnter)
        self.close = wx.Button(panel, -1, "Exit")
        self.Bind(wx.EVT_BUTTON, self.OnCloseMe)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

        # use gridbagsizer for layout of widgets
        sizer = wx.GridBagSizer(vgap=6, hgap=6)
        sizer.Add(label1, pos=(0, 0))
        sizer.Add(self.idKomitent, pos=(0, 2))  # row 0, column 2
        sizer.Add(label2, pos=(1, 0))
        sizer.Add(self.Drzava, pos=(1, 2))
        sizer.Add(label3, pos=(2, 0))
        sizer.Add(self.Prg, pos=(2, 2))
        sizer.Add(label4, pos=(3, 0))
        sizer.Add(self.Provajder, pos=(3, 2))
        sizer.Add(label5, pos=(4, 0))
        sizer.Add(self.ServerName, pos=(4, 2))
        sizer.Add(label6, pos=(5, 0))
        sizer.Add(self.DataBaseName, pos=(5, 2))
        sizer.Add(label7, pos=(6, 0))
        sizer.Add(self.Sifarnici, pos=(6, 2))
        sizer.Add(self.calc_btn, pos=(8, 1))
        sizer.Add(self.close, pos=(8, 2))

        # use boxsizer to add border around sizer
        border = wx.BoxSizer()
        border.Add(sizer, 0, wx.ALL, 20)
        panel.SetSizerAndFit(border)
        self.Fit()

    def onEnter(self, event):
        # get the values from the input widgets
        idKomitent = int(self.idKomitent.GetValue())
        Drzava = str(self.Drzava.GetValue())
        Prg = str(self.Prg.GetValue())
        Provajder = str(self.Provajder.GetValue())
        ServerName = str(self.ServerName.GetValue())
        DataBaseName = str(self.DataBaseName.GetValue())
        Sifarnici = str(self.Sifarnici.GetValue())
        db = MySQLdb.connect("127.0.0.1", "user", "password", "database")
        cursor = db.cursor()
        cursor.execute("INSERT INTO setup (idKomitent, Drzava, Prg, Provajder, ServerName, DataBaseName, Sifarnici) VALUES (%s, %s, %s, %s, %s, %s, %s)", (idKomitent, Drzava, Prg, Provajder, ServerName, DataBaseName, Sifarnici))
        cursor.execute("commit")
        self.idKomitent.Clear()
        self.Drzava.Clear()
        self.Prg.Clear()
        self.Provajder.Clear()
        self.ServerName.Clear()
        self.DataBaseName.Clear()
        self.Sifarnici.Clear()
        cursor.close()

    def OnCloseMe(self, event):
        self.Close(True)

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


app = wx.App()
frame = InsertData(None, -1, "Tabela MySQL Setup")
frame.Show()
app.MainLoop()

And final delete script

import wx
import MySQLdb

db = MySQLdb.connect("127.0.0.1", "root", "aaa111bbb", "mysqlsetup")
cursor = db.cursor()


class DeleteData(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self)
        panel = wx.Panel(self, -1)
        panel.SetBackgroundColour('light gray')
        #iconFile = "Grocery.ico"
        #icon1 = wx.Icon(iconFile, wx.BITMAP_TYPE_ICO)
        #self.SetIcon(icon1)
        label1 = wx.StaticText(panel, -1, "idSetup:")

        self.idSetup = wx.TextCtrl(panel, -1, "")
        self.calc_btn = wx.Button(panel, -1, 'Delte')
        self.calc_btn.Bind(wx.EVT_BUTTON, self.onEnter)
        self.close = wx.Button(panel, -1, "Exit")
        self.Bind(wx.EVT_BUTTON, self.OnCloseMe)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

        # use gridbagsizer for layout of widgets
        sizer = wx.GridBagSizer(vgap=3, hgap=3)
        sizer.Add(label1, pos=(0, 0))
        sizer.Add(self.idSetup, pos=(0, 2))  # row 0, column 2
        sizer.Add(self.calc_btn, pos=(2, 1))
        sizer.Add(self.close, pos=(2, 2))

        # use boxsizer to add border around sizer
        border = wx.BoxSizer()
        border.Add(sizer, 0, wx.ALL, 20)
        panel.SetSizerAndFit(border)
        self.Fit()

    def onEnter(self, event):
        # get the values from the input widgets
        idSetup = int(self.idSetup.GetValue())
        db = MySQLdb.connect("127.0.0.1", "user", "password", "database")
        cursor = db.cursor()
        cursor.execute("DELETE FROM setup WHERE idSetup = '%s'" % (idSetup))
        cursor.execute("commit")
        self.idSetup.Clear()
        cursor.close()

    def OnCloseMe(self, event):
        self.Close(True)

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


app = wx.App()
frame = DeleteData(None, -1, "Tabela MySQL Setup")
frame.Show()
app.MainLoop()

Where i made mistake??


Solution

  • I think that it might be as simple as adding:

    if __name__ == "__main__":
    

    before your app=wx.App() sections
    i.e.

    if __name__ == "__main__":
        app = wx.App(0)
        frame = GlavniProzor(None)
        app.MainLoop()
    

    Note: using the names ,index,main,insert and delete for your program names is probably a bad idea, they are in danger of being interpreted as keywords if not by python itself by anyone reading the code.