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

如何获取调整大小后Tkinter Text组件的高度?如何以行数为单位获取新高度?

好的,我来帮你搞定这两个问题!针对你给出的Tkinter Text组件示例,我们可以分别通过两种方式获取调整后的高度——像素单位和行数单位,下面是具体的实现方法:

1. 获取调整后的Text组件像素高度

Tkinter的所有组件都提供了winfo_height()方法,它可以返回组件当前实际显示的高度(单位是像素)。不过这个值会在窗口大小改变时实时更新,所以我们可以通过绑定<Configure>事件来监听组件大小变化,从而实时获取最新高度。

修改你的代码,添加监听和显示逻辑:

import tkinter as tk

class MainWindow:
    def __init__(self, parent):
        self.parent = parent
        # 创建Text组件
        self.viewText = tk.Text(parent, height=32, width=20)
        self.viewText.grid(row=0, column=0, sticky=tk.NSEW)
        parent.grid_rowconfigure(0, weight=1)
        parent.grid_columnconfigure(0, weight=1)
        
        # 添加标签显示结果
        self.result_label = tk.Label(parent, text="当前高度:")
        self.result_label.grid(row=1, column=0, sticky=tk.W)
        
        # 绑定组件大小变化事件
        self.viewText.bind("<Configure>", self.on_text_resize)
        
    def on_text_resize(self, event):
        # 获取像素高度
        pixel_height = self.viewText.winfo_height()
        # 更新标签内容
        self.result_label.config(text=f"当前像素高度:{pixel_height}px")

if __name__ == "__main__":
    app = tk.Tk()
    app.title("Text组件高度获取示例")
    window = MainWindow(app)
    app.mainloop()

这里的<Configure>事件会在组件大小改变时触发,winfo_height()返回的是组件整体的像素高度(包括边框)。如果需要获取内部内容区域的高度,可以减去上下边框的宽度:

inner_height = pixel_height - 2 * self.viewText.winfo_borderwidth()
2. 获取以行数为单位的调整后高度

要得到组件能显示的行数,我们需要先计算出每行文本的高度,再用组件的内部高度除以行高。具体步骤如下:

  1. 获取Text组件使用的字体对象
  2. 通过字体对象获取每行的高度(包含行间距的总行高)
  3. 用组件内部高度除以行高,得到可显示的行数

修改代码实现这个逻辑:

import tkinter as tk
from tkinter import font

class MainWindow:
    def __init__(self, parent):
        self.parent = parent
        self.viewText = tk.Text(parent, height=32, width=20)
        self.viewText.grid(row=0, column=0, sticky=tk.NSEW)
        parent.grid_rowconfigure(0, weight=1)
        parent.grid_columnconfigure(0, weight=1)
        
        self.result_label = tk.Label(parent, text="当前可显示行数:")
        self.result_label.grid(row=1, column=0, sticky=tk.W)
        
        # 获取Text组件的字体对象
        self.text_font = font.Font(font=self.viewText.cget('font'))
        # 绑定大小变化事件
        self.viewText.bind("<Configure>", self.on_text_resize)
        
    def on_text_resize(self, event):
        # 获取组件整体像素高度
        total_height = self.viewText.winfo_height()
        # 计算内部内容区域高度(减去上下边框)
        border_width = self.viewText.winfo_borderwidth()
        inner_height = total_height - 2 * border_width
        # 获取每行的高度(包含行间距)
        line_height = self.text_font.metrics('linespace')
        # 计算可显示的行数(向下取整,确保是完整显示的行数)
        display_lines = inner_height // line_height
        
        self.result_label.config(text=f"当前可显示行数:{display_lines}行")

if __name__ == "__main__":
    app = tk.Tk()
    app.title("Text组件行数获取示例")
    window = MainWindow(app)
    app.mainloop()

这里的font.metrics('linespace')返回的是字体的总行高(包含行间距),计算出来的行数就是组件当前能完整显示的文本行数。如果需要更精确的行高(不含额外行间距),也可以用font.metrics('ascent') + font.metrics('descent')来计算,不过linespace通常更符合实际显示的行数效果。

另外要注意:如果你的Text组件设置了wrap属性,换行的文本会占用多行,但这里计算的是组件的物理显示行数,不是文本内容的总行数哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:45:16