HAKER HAKER
Знаток
(314)
1 неделю назад
Проблема в том, что вы пытаетесь разместить CTkTable внутри CTkScrollableFrame с помощью place, а это не всегда работает как ожидается. CTkScrollableFrame сам по себе не является контейнером, а скорее элементом, который может быть использован для создания скроллинга.
Вот как лучше разместить таблицу в CTkScrollableFrame:
Создайте CTkFrame внутри CTkScrollableFrame:
frame = ctk.CTkScrollableFrame(root, orientation="horizontal", width=600, fg_color="transparent")
frame.place(x=300, y=28)
inner_frame = ctk.CTkFrame(frame, fg_color="transparent")
inner_frame.pack(expand=True, fill="both")
inner_frame будет контейнером для вашей таблицы.
pack(expand=True, fill="both") заставляет inner_frame растягиваться и занимать все доступное пространство в frame.
Разместите CTkTable внутри inner_frame:
studentsTable = CTkTable(inner_frame, values=studentsTableList, width=300)
studentsTable.pack(side="left")
pack(side="left") поместит таблицу слева внутри inner_frame.
Полный код:
import customtkinter as ctk
from CTkTable import *
import sqlite3
conn = sqlite3.connect("marks.db")
curs = conn.cursor()
grade = "4А"
root = ctk.CTk()
root.title("Редактирование оценок")
root.geometry("1000x250")
studentsTableList = [["Число"],
["Тип работы"]]
marksTableList = [[""],
[""]]
curs.execute("SELECT name FROM students WHERE grade == ?", (grade,))
students1 = curs.fetchall()
students2 = []
print(students1)
for student in students1:
students2.append(student)
for student in students2:
studentsTableList.append([student])
marksTableList.append([""])
tip = ctk.CTkLabel(root, text="Нажмите на колёсико для добавления урока").place(x=0, y=0)
frame = ctk.CTkScrollableFrame(root, orientation="horizontal", width=600, fg_color="transparent")
frame.place(x=300, y=28)
inner_frame = ctk.CTkFrame(frame, fg_color="transparent")
inner_frame.pack(expand=True, fill="both")
studentsTable = CTkTable(inner_frame, values=studentsTableList, width=300)
studentsTable.pack(side="left")
marksTable = CTkTable(root, values=marksTableList, write=1)
marksTable.place(x = 300, y = 28)
# ... (остальной код)
root.mainloop()
Объяснение:
CTkScrollableFrame создает область скроллинга.
CTkFrame внутри CTkScrollableFrame действует как контейнер для содержимого, которое вы хотите сделать прокручиваемым (в данном случае, таблица).
pack в данном случае является более подходящим менеджером размещения для CTkFrame и CTkTable, потому что он автоматически растягивает CTkTable в CTkFrame, создавая эффект скроллинга при необходимости.
Дополнительно:
Помните, что CTkTable работает с pack, а не с place!
CTkTable может быть довольно ресурсозатратным, особенно с большим количеством данных. Возможно, вам стоит подумать о других вариантах, например, Treeview из tkinter, если вы работаете с большим количеством данных.
Надеюсь, это решение поможет вам!
Кусок кода: Скриншот (с frame):