Tkinter: несколько окон не работают

#python #tkinter

#python #tkinter

Вопрос:

Имя базы данных: customs
Имя таблицы: dummy(int (primary id), varchar)
Цель: 1. Вставить в базу данных 2. Показать значения
пользовательского интерфейса базы данных:
1. Mainapp: предоставляет возможность вставки и отображения
2. Вставка: вставляет в базу данных
3. Дисплей: отображает значения базы данных

Независимые модули Mainapp, Insert и Display работают должным образом,
тогда как экземпляр Insert (или) Display внутри класса Mainapp не работает.

 import Tkinter
import MySQLdb
db = MySQLdb.connect("localhost","root","root", "customs")

class Insert(Tkinter.Tk):
    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)
        self.parent=parent
        self.initialise()

    def initialise(self):
        self.grid()
        self.grid_columnconfigure(0,weight=1)
        self.resizable(True, False)   

        self.entryVariable=Tkinter.StringVar()
        self.entry = Tkinter.Entry(self, textvariable=self.entryVariable)
        self.entry.grid(column=0, row=0, sticky='EW')
        self.entryVariable.set(u"Enter PID")

        self.entryVariable2=Tkinter.StringVar()
        self.entry2 = Tkinter.Entry(self, textvariable=self.entryVariable2)
        self.entry2.grid(column=0, row=1, sticky='EW')
        self.entryVariable2.set(u"Enter Name")

        self.button=Tkinter.Button(self, text="Insert", command=self.OnButtonClick)
        self.button.grid(column=0, row=2)

        self.VarLabel = Tkinter.StringVar()
        self.label=Tkinter.Label(self, textvariable=self.VarLabel, anchor="w", fg="white", bg="red")
        self.label.grid(column=0, row=3)
        self.VarLabel.set(u"Enter Details!")

    def OnButtonClick(self):
        Id=int(self.entryVariable.get())
        name=self.entryVariable2.get()
        sql="INSERT INTO dummy VALUES('%d', '%s')"%(Id, name)
        try:
            cursor = db.cursor()
            cursor.execute(sql)
            db.commit()
            self.VarLabel.set("Inserted Successfully")
        except:
            self.VarLabel.set("Error: did  not insert")
            db.rollback()

class Display(Tkinter.Tk):
    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)
        self.parent=parent
        self.initialise()
    def initialise(self):
        self.grid()
        self.grid_columnconfigure(0,weight=1)
        self.resizable(True, False)

        self.VarLabel = Tkinter.StringVar()
        self.label=Tkinter.Label(self, textvariable=self.VarLabel, anchor="w", fg="black", bg="white")
        self.label.grid(column=0, row=0)

        cursor = db.cursor()
        xx="dummy"
        sql="SELECT * FROM %s"%(xx)
        cursor.execute(sql)
        result=cursor.fetchall()
        ans="n%snIDtNamen"%(xx)
        for res in result:
            ans=ans str(int(res[0])) "t" str(res[1]) "n"
        self.VarLabel.set(ans)

class MainApp(Tkinter.Tk):
    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)
        self.parent=parent
        self.initialise()
    def initialise(self):
        self.grid()
        self.grid_columnconfigure(0,weight=1)
        self.resizable(True, False)

        self.button=Tkinter.Button(self, text="Insert", command=self.insert)
        self.button.grid(column=0, row=0)

        self.button2=Tkinter.Button(self, text="Show", command=self.display)
        self.button2.grid(column=0, row=1)

    def insert(self):
        app=Insert(None)
        app.title("Customs-Insert")
        app.mainloop()

    def display(self):
        app=Display(None)
        app.title("Customs-Display")
        app.mainloop()

if __name__=="__main__":
    mainapp=MainApp(None)
    mainapp.title("Customs")
    mainapp.mainloop()

db.close()
  

Комментарии:

1. У вас должен быть только 1 экземпляр Tk и вместо этого используйте Windows верхнего уровня.

2. … и вызываем mainloop ровно один раз.