You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TK界面第二页TreeView列调整大小功能失效问题求助

解决Tkinter多页面中TreeView列无法调整大小的问题

我来帮你搞定这个问题!你遇到的核心问题是容器布局的权重配置缺失——TreeView所在的各级父容器没有设置拉伸权重,导致TreeView无法随着窗口大小变化,列调整功能自然就失效了。

问题根源

你现在只给主窗口(controller)设置了columnconfigurerowconfigure,但TreeView的层级是:SampleAppcontainerPageOneframe_treeTreeView。后面这几个容器(PageOne、frame_tree)都没有配置权重,当窗口调整时,它们不会跟着拉伸,TreeView也就没有足够的空间来响应列调整操作。另外,你给TreeView设置grid()的时候没加sticky参数,它不会填满父容器frame_tree,这也会影响列调整的效果。

修复步骤

  1. PageOne的grid布局设置权重,让它能填满父容器container
  2. frame_tree的grid布局设置权重,让它能填满PageOne
  3. 给TreeView的grid()添加sticky="nsew",让它填满frame_tree
  4. frame_tree设置rowconfigurecolumnconfigure,让TreeView能在其中拉伸

修改后的完整代码

import tkinter as tk
from tkinter import ttk
import tkfont  # 补充原代码遗漏的导入

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        container = tk.Frame(self)
        container.grid(sticky="nsew")  # 让container填满主窗口
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        button1 = tk.Button(self, text="Go to Database", command=lambda: controller.show_frame("PageOne"))
        button1.grid(padx=20, pady=20)  # 增加内边距提升美观度

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        
        # 让PageOne填满父容器
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        
        # Tree View容器
        frame_tree = tk.LabelFrame(self, text="Database")
        frame_tree.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
        
        # 让frame_tree填满PageOne
        frame_tree.grid_rowconfigure(0, weight=1)
        frame_tree.grid_columnconfigure(0, weight=1)
        
        tree_columns = ('zero','one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen' )
        tree = ttk.Treeview(frame_tree, columns=tree_columns, show="headings", height=18)
        
        # 循环设置表头,替代重复代码
        for col_idx, col_name in enumerate(tree_columns, start=1):
            tree.heading(f'#{col_idx}', text=f'COLUMN {col_idx}')
            tree.column(f'#{col_idx}', width=100)  # 设置初始列宽
        
        # 让TreeView填满frame_tree并支持拉伸
        tree.grid(row=0, column=0, sticky="nsew")

if __name__ == "__main__":
    app = SampleApp()
    app.geometry("1200x600")  # 设置初始窗口尺寸
    app.mainloop()

关键修改点说明

  • PageOne添加了权重配置,确保它能跟着父容器container拉伸
  • frame_tree设置了sticky="nsew"和权重配置,让它填满PageOne并给TreeView留出拉伸空间
  • TreeView的grid()加上sticky="nsew",让它完全填充frame_tree
  • 用循环简化了表头设置代码,同时给列添加了初始宽度
  • 修复了原代码遗漏的tkfont导入问题

现在切换到第二页后,TreeView的列就能正常调整大小了,整个布局也会跟着窗口大小自适应拉伸。

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

火山引擎 最新活动