Python treeview和网格

时间:2015-12-10 11:19:45

标签: python tkinter treeview

问题是,当在双击子程序中创建一些对象时,网格会搞砸。树视图向右扩展一点,并且假设在第1列中的标签和按钮看起来像在第3列中(在第3列的树视图上方的按钮上)。此外,当我尝试制作一个按钮时,它将它放在树视图上方,无论它的行。 代码:

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 个答案:

答案 0 :(得分:1)

你犯的错误是你试图把所有东西放到一个大的网格中,但填充那个网格的代码分散在整个程序中。您的UI显然有三个不同的部分,您应该以这种方式组织GUI。

为顶部创建框架,为树视图创建框架,为底部创建框架。您可以使用pack将它们放在主窗口中,一个放在另一个窗口的顶部。然后,将其他小部件放在适当的框架中。这样,您在一个部分中所做的更改(添加或删除列或行,切换到pack等)不会影响其他区域。