Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с Python customtkinter

Тимур Сперанский Профи (517), открыт 1 неделю назад
У меня проблема: таблица не отображается в ScrollableFrame
Кусок кода:
 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)

studentsTable =CTkTable(frame, values=studentsTableList, width=300)
studentsTable.place(x=0, y=28)

marksTable = CTkTable(root, values=marksTableList, write=1)
marksTable.place(x = 300, y = 28)

...

root.mainloop()
Скриншот (с frame):

Хотя если я уберу frame (буду размещать таблицу в главном окне), то она спокойно отобразится:

*на изображении frame я не убирал, но таблица отображается в главном окне
1 ответ
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, если вы работаете с большим количеством данных.
Надеюсь, это решение поможет вам!
Похожие вопросы