You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CustomTkinter Grid布局下MySQL数据表格位置异常求助

解决CustomTkinter中Pandastable表格布局异常问题

问题根源

  1. Grid行号误用:你把表格的grid(row=310, column=0)设为310,但Grid布局的row是索引序号(从0开始),不是像素位置,这直接导致表格被放到超出可见区域的位置,最终被挤压到窗口侧边。
  2. 组件兼容问题:Pandastable的Table基于原生tkinter开发,直接放入CTkFrame时未做布局适配,引发滚动条异常。
  3. 缺少布局配置:标题与表格间无间距,父容器未设置权重规则,导致布局错位。

修改后的代码

import customtkinter 
import mysql.connector
import pandas as pd
from pandastable import Table, TableModel

conn = mysql.connector.connect(user='root', password='0000', host='localhost', database='python', auth_plugin='mysql_native_password')
cursor = conn.cursor()

class MyFrame(customtkinter.CTkFrame):
    def __init__(self, master):
        super().__init__(master)
        # 配置Frame的布局权重,让组件自适应窗口
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)

        # 标题组件,增加内边距优化排版
        self.header = customtkinter.CTkLabel(self, text="Dashboard", fg_color="transparent", font=("Product Sans",48))
        self.header.grid(row=0, column=0, sticky="w", padx=20, pady=(20, 10))

        # 加载数据库数据
        command = "select * from fruits"
        table_width = 800
        table_height = 400
        df = pd.read_sql_query(command, conn)

        # 用CTkFrame包裹Table,解决原生组件与CustomTkinter的兼容问题
        table_container = customtkinter.CTkFrame(self)
        table_container.grid(row=1, column=0, sticky="nsew", padx=20, pady=10)
        table_container.grid_rowconfigure(0, weight=1)
        table_container.grid_columnconfigure(0, weight=1)

        # 创建并配置表格
        pt = Table(table_container, dataframe=df, width=table_width, height=table_height, 
                   showtoolbar=False, showstatusbar=False, showRowNumber=False)
        pt.grid(row=0, column=0, sticky="nsew")
        pt.show()
        pt.hideRowHeader()

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()

        self.title("my app")
        self.geometry("1280x720")
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        self.frame = MyFrame(self)
        self.frame.grid(row=0, column=0, sticky='nsew')  # 让Frame充满窗口

        self.button = customtkinter.CTkButton(self, text="my button")
        self.button.grid(row=1, column=0, padx=10, pady=10, sticky="ew")

app = App()
app.mainloop()

关键修改点

  • 修正Grid行号:将表格放在row=1(紧跟标题的row=0),用padx/pady设置间距,确保表格显示在标题正下方。
  • 添加容器包裹表格:用CTkFrame封装Pandastable的Table,解决样式与布局兼容问题,同时配置容器权重让表格自适应大小。
  • 优化尺寸与粘性设置:增大表格高度避免滚动条异常,设置sticky="nsew"让表格填满容器。
  • 配置布局权重:给父容器添加grid_rowconfigure/grid_columnconfigure规则,让组件随窗口大小自动调整。

额外提示

  • Grid布局的row/column是布局索引,不是像素坐标,需按顺序从0开始使用。
  • 非CustomTkinter原生组件尽量用CTk容器包裹,保证样式与布局一致性。
  • 若滚动条仍有问题,可手动设置showverticalscrollbar=False/showhorizontalscrollbar=False控制显示。

内容的提问来源于stack exchange,提问作者SaladSnake2214

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:00:01