1

The problem is that when some objects are being created in the double click subroutine the grid goes messed up. The tree view expands a bit to the right and labels and buttons which are suppose to go in column 1 look like they are in column 3(went off button above tree view which is in column 3). Also when I try making a button it puts it above the tree view no matter its row. Code:

from tkinter import *
import os
import datetime
import sqlite3
from tkinter.ttk import Combobox,Treeview,Scrollbar

class Application(Frame):
    """ Binary to Decimal """ 
    def __init__(self, master):
        """ Initialize the frame. """
        super(Application, self).__init__(master)
        self.grid()
        self.create_GUI()

    def Quit(self):
        self.master.destroy()

    def create_GUI(self):
        self.title_lbl = Label(self, text = "Students")
        self.title_lbl.grid(row = 0, column = 2)

        self.fn_lbl = Label(self, text = "First Name:")
        self.fn_lbl.grid(row = 1 , column = 1)

        self.fn_txt = Entry(self)
        self.fn_txt.grid(row = 1, column = 2)

        self.ln_lbl =Label(self, text = "Last Name:")
        self.ln_lbl.grid(row = 2, column = 1)

        self.ln_txt = Entry(self)
        self.ln_txt.grid(row = 2, column = 2)

        self.q_btn = Button(self, text = "Back",padx=80,pady=10, command = lambda: self.Quit)
        self.q_btn.grid(row = 3, column = 0)

        self.s_btn = Button(self, text = "search",padx=80,pady=10, command = lambda: self.search())
        self.s_btn.grid(row = 3,column = 3)

        self.tree = Treeview(self.master,height = 6)
        self.tree["columns"] = ("StudentID","First Name","Last Name")#,"House Number", "Street Name", "Town Or City Name","PostCode","MobilePhoneNumber")
        self.tree.column("StudentID",width = 20)
        self.tree.column("First Name",width = 40)
        self.tree.column("Last Name", width = 40)
##        self.tree.column("House Number", width = 60)
##        self.tree.column("Street Name", width = 60)
##        self.tree.column("Town Or City Name", width = 60)
##        self.tree.column("PostCode", width = 60)
##        self.tree.column("MobilePhoneNumber", width = 60)

        self.tree.heading("StudentID",text="StudentID")
        self.tree.heading("First Name",text="First Name")
        self.tree.heading("Last Name",text="Last Name")
##        self.tree.heading("House Number",text="House Number")
##        self.tree.heading("Street Name",text="Street Name")
##        self.tree.heading("Town Or City Name",text="Town Or City Name")
##        self.tree.heading("PostCode",text="PostCode")
##        self.tree.heading("MobilePhoneNumber",text="MobilePhoneNumber")

        self.tree["show"] = "headings"
        yscrollbar = Scrollbar(self.master, orient='vertical', command=self.tree.yview)
        xscrollbar = Scrollbar(self.master, orient='horizontal', command=self.tree.xview)
        self.tree.configure(yscroll=yscrollbar.set, xscroll=xscrollbar.set)
        yscrollbar.grid(row=4, column=3, padx=2, pady=2, sticky=NS)
        self.tree.grid(row=4,column=0,columnspan =5, padx=2,pady=2,sticky =NSEW)
        self.tree.bind("<Double-1>",lambda event :self.OnDoubleClick(event))

    def OnDoubleClick(self, event):
        curItem = self.tree.focus()
        contents =(self.tree.item(curItem))
        StudentDetails = contents['values']
        print(StudentDetails)

        self.tStudentID=StringVar()
        self.tFirstName = StringVar()
        self.tLastName = StringVar()
        self.tHouseNumber = StringVar()
        self.tStreetName = StringVar()
        self.tTownOrCityName = StringVar()
        self.tPostCode = StringVar()
        self.tEmail = StringVar()
        self.tMobilePhoneNumber = StringVar()

        self.tStudentID.set(StudentDetails[0])
        self.tFirstName.set(StudentDetails[1])
        self.tLastName.set(StudentDetails[2])
        self.tHouseNumber.set(StudentDetails[3])
        self.tStreetName.set(StudentDetails[4])
        self.tTownOrCityName.set(StudentDetails[5])
        self.tPostCode.set(StudentDetails[6])
        self.tEmail.set(StudentDetails[7])
        self.tMobilePhoneNumber.set(StudentDetails[8])

        self.inst_lbl0 = Label(self.master, text = "Student ID").grid(row=5,column=0,sticky=W)
        self.NStudentID = Label(self.master, textvariable=self.tStudentID).grid(row =5,column=1,stick=W)
        self.inst_lbl1 = Label(self.master, text = "First Name").grid(row=6,column=0,sticky=W)
        self.NFirstName = Entry(self.master, textvariable=self.tFirstName).grid(row =6,column=1,stick=W)
        self.inst_lbl2 = Label(self.master, text = "Last Name").grid(row=7,column=0,sticky=W)
        self.NLastName = Entry(self.master, textvariable=self.tLastName).grid(row =7,column=1,stick=W)
        self.inst_lbl3 = Label(self.master, text = "House Number").grid(row=8,column=0,sticky=W)
        self.HouseNumber = Entry(self.master,textvariable=self.tHouseNumber).grid(row=8,column=1,sticky=W)
        self.inst_lbl4 = Label(self.master, text = "Street Name").grid(row=9,column=0,sticky=W)
        self.StreetName =Entry(self.master,textvariable=self.tStreetName).grid(row=9,column=1,sticky=W)
        self.inst_lbl5 = Label(self.master, text = "Town or City Name").grid(row=10,column=0,sticky=W)
        self.TownOrCityName =Entry(self.master,textvariable=self.tTownOrCityName).grid(row=10,column=1,sticky=W)
        self.inst_lbl6 = Label(self.master, text = "Postcode").grid(row=11,column=0,sticky=W)
        self.PostCode = Entry(self.master,textvariable=self.tPostCode).grid(row=11,column=1,sticky=W)
        self.inst_lbl7 = Label(self.master, text = "Email").grid(row=12,column=0,sticky=W)
        self.Email =Entry(self.master,textvariable=self.tEmail).grid(row=12,column=1,sticky=W)
        self.inst_lbl8 = Label(self.master, text = "Mobile phonenumber").grid(row=13,column=0,sticky=W)
        self.MobilePhoneNumber =Entry(self.master,textvariable=self.tMobilePhoneNumber).grid(row=13,column=1,sticky=W)

        self.btnSaveChanges = Button(self, text = "save changes",padx=80,pady=10,command = lambda:self.SaveChanges).grid(row=14,column=0,sticky=W)
        #self.btnSaveChanges = Button(self, text = "delete record",padx=80,pady=10,command = lambda:self.DeleteRecord).grid(row=14,column=1,sticky=W)


    def search(self):
        FirstName = self.fn_txt.get()
        LastName = self.ln_txt.get()
        with sqlite3.connect("GuitarLessons.db") as db:
            cursor = db.cursor()
            cursor.row_factory = sqlite3.Row
            sql = "select StudentID,FirstName,LastName,HouseNumber,StreetName,TownOrCityName,PostCode,Email,MobilePhoneNumber"\
                  " from tblStudents"\
                  " where FirstName like ?"\
                  " and LastName like ?"
            cursor.execute(sql,("%"+FirstName+"%","%"+LastName+"%",))
            StudentList = cursor.fetchall()
            print(StudentList)

        self.loadStudents(StudentList)

    def loadStudents(self,StudentList):
        for i in self.tree.get_children():
            self.tree.delete(i)

        for student in StudentList:
            self.tree.insert("" , 0,values=(student[0],student[1],student[2],student[3],student[4],student[5],student[6],student[7],student[8]))

    def SaveChanges(self):
        with sqlite3.connect("GuitarLessons.db") as db:
            cursor = db.cursor()
            sql = "update tblStudents set FirstName =?,LastName=?,HouseNumber=?,StreetName=?,TownOrCityName=?,PostCode=?,Email=?,MobilePhoneNumber=? where StudentID=?"
            cursor.execute(sql,("%"+NFirstName+"%","%"+NLastName+"%","%"+NHouseNumber+"%","%"+NStreetName+"%","%"+NTownOrCityName+"%","%"+NPostCode+"%","%"+NEmail+"%","%"+NMobilePhoneNumber+"%"))
            db.commit()

    def DeleteRecord(self):
        print("")

root = Tk()
root.title("booking system")
root.geometry("800x800")
root.configure(bg="white")
app = Application(root)

root.mainloop()
1
  • Please try to reduce that code down, and remove the dependency on sqlite. Surely you can reproduce your problem with much less code. Commented Dec 10, 2015 at 13:10

1 Answer 1

4

The mistake you are making is that you're trying to put everything into one massive grid, but the code to populate that grid is scattered throughout your program. Your UI clearly has three distinct sections, you should organize your GUI that way.

Create a frame for the top, a frame for the treeview, and a frame for the bottom section. You can use pack to place these in the master window, one on top of the other. Then, place your other widgets in the appropriate frame. This way, changes you make in one section (adding or removing columns or rows, switching to pack, etc) won't affect the other areas.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the feedback ill set about doing that

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.