Как я могу всегда точно установить окна ttk вокруг колонн? - PullRequest
3 голосов
/ 30 октября 2019

Мне нужно отобразить таблицы на основе запросов, используя ttk из tkinter. Я использовал ttk Treeview, чтобы создать верхнюю рамку, содержащую столбцы. Затем нижняя рамка, содержащая три кнопки. Эти три кнопки связаны с тремя функциями, которые отображают различную информацию в зависимости от введенных запросов.

import pymysql
from tkinter import *
from tkinter.ttk import *

#db = pymysql.connect() I erased my info here
cursor = db.cursor()

root = Tk()
frame = Frame(root)
frame.pack()
tree = Treeview(frame)
tree.pack()


def stu_dep():
    for row in tree.get_children():
        tree.delete(row)

    tree["columns"] = ("Name", "DOB", "DepName")
    tree.column("#0", width=100)
    tree.column("Name", width=100)
    tree.column("DOB", width=100)
    tree.column("DepName", width=110)

    tree.heading("#0", text="Panther ID")
    tree.heading("Name", text="Name")
    tree.heading("DOB", text="Birth year")
    tree.heading("DepName", text="Department Name")

    stu_dep_info_quer = "SELECT Student.Panther_ID, Student.Name, Student.DOB, Department.Name FROM Student, Department WHERE Student.Department_ID = Department.Department_ID"
    cursor.execute(stu_dep_info_quer)
    result = cursor.fetchall()
    for i in range(0, len(result)):
        tree.insert("", i, text=str(result[i][0]), values=(str(result[i][1]), str(result[i][2]), str(result[i][3]) ))


def inst_info():
    for row in tree.get_children():
        tree.delete(row)

    tree["columns"] = ("Name", "Dep_ID")
    tree.column("#0", width=100)
    tree.column("Name", width=100)
    tree.column("Dep_ID", width=100)

    tree.heading("#0", text="Instructor_ID")
    tree.heading("Name", text="Name")
    tree.heading("Dep_ID", text="Department_ID")

    inst_info_quer = "SELECT * FROM Instructor"
    cursor.execute(inst_info_quer)
    result = cursor.fetchall()
    for i in range(0, len(result)):
        tree.insert("", i, text=str(result[i][0]), values=(str(result[i][1]), str(result[i][2])))


def stu_info():
    for row in tree.get_children():
        tree.delete(row)

    tree["columns"] = ("Name", "DOB")
    tree.column("#0", width=100)
    tree.column("Name", width=100)
    tree.column("DOB", width=100)

    tree.heading("#0", text="Panther ID")
    tree.heading("Name", text="Name")
    tree.heading("DOB", text="Birth year")

    stu_info_quer = "SELECT * FROM Student"
    cursor.execute(stu_info_quer)
    result = cursor.fetchall()
    for i in range(0, len(result)):
        tree.insert("", i, text=str(result[i][0]), values=(str(result[i][1]), str(result[i][2])))


bFrame = Frame(root)
bFrame.pack(side = BOTTOM)

stu_dep_button = Button(bFrame, text = "Student_Department", command = stu_dep)
stu_dep_button.grid(row = 0, column = 0)

instructor_button = Button(bFrame, text = "Instructor_Info", command = inst_info)
instructor_button.grid(row = 0, column = 1)

student_button = Button(bFrame, text = "Student_Info", command = stu_info)
student_button.grid(row = 0, column = 2)


stu_info()

root.mainloop()

На следующем снимке экрана показана схема перед нажатием любой кнопки. Окно изначально хорошо вписывается в колонны. Функция stu_info вызывается в конце программы и отображается без нажатия кнопок.

Works

Но после нажатия любой из кнопок экран больше не идеально подходит для столбцов:

Broken

После нажатия некоторых кнопок и возврата информации об ученике теперь справа появляется пустое место.

Q : Как я могу всегда точно устанавливать окна ttk вокруг колонн?

...