我有一个Text
小部件,它保存一个包含\n
字符(多行)的自定义字符串。
小部件放置在一个垂直的panedwindow
中,我想调整panedwindow
的窗扇以显示Text
小部件中的整个字符串。
字符串本质上是动态的(这意味着,它正在由应用程序中的其他方法更新)。
由于Text
小部件是用wrap='word'
配置的,我如何计算字符串的像素高度来相应地调整窗扇?
在字符串加载到小部件后,我尝试使用text.dlineInfo('end -1c')[1] + text.dlineinfo('end -1c')[3]
(表示行的y坐标+高度)。问题是,如果最后一行不可见,那么dlineinfo将返回none
。
我还尝试使用Font.measure
例程,但这不包括Text
小部件的 Package 方面。
下面是一个最小的,完整的,可验证的例子:
import tkinter
from tkinter import scrolledtext
class GUI():
def __init__(self, master):
self.master = master
self.body_frame = tkinter.PanedWindow(self.master, orient='vertical', sashwidth=4)
self.body_frame.pack(expand=1, fill='both')
self.canvas_frame = tkinter.Frame(self.body_frame)
self.description_frame = tkinter.Frame(self.body_frame)
self.body_frame.add(self.canvas_frame, sticky='nsew')
self.body_frame.add(self.description_frame, sticky='nsew')
tkinter.Button(self.canvas_frame, text='Update Text', command = lambda : self.update_text("""
A very long string with new lines
A very long string with new lines
A very long string with new lines
A very long string with new lines
A very long string with new lines
A very long string with new lines
""")).pack(fill='x')
self.field_description = scrolledtext.ScrolledText(self.description_frame, width=20, wrap='word')
self.field_description.pack(expand=1, fill='both')
self.master.update()
self.body_frame.sash_place(0,0,self.body_frame.winfo_height() - 50) # force sash to be lower
def update_text(self, description):
self.field_description.delete('1.0', 'end')
self.field_description.insert('1.0', description)
height = self.body_frame.winfo_height()
lastline_index = self.field_description.index('end - 1c')
text_height = self.field_description.dlineinfo(lastline_index)[1] + \
self.field_description.dlineinfo(lastline_index)[3]
self.body_frame.sash_place(0, 0, height - text_height)
root = tkinter.Tk()
my_gui = GUI(root)
root.mainloop()
字符串
2条答案
按热度按时间jfgube3f1#
我不知道有任何内置方法可以返回tkinter
Text
小部件中的总行数(* 包括换行 *)。但是,您可以手动计算这个数字,方法是将文本小部件中未断开字符串的长度与文本小部件的精确宽度(减去填充)进行比较。下面的
LineCounter
类就是这样做的:的数据
字符串
使用示例:
型
在您的具体情况下,您的
ScrolledText
中换行的高度可以在update_text()
中确定,如下所示:型
nx7onnlm2#
你知道文本中的行数。当
dlineinfo
返回None时,你可以判断出一行何时离开了滚动区域。所以在运行dlineinfo()
调用之前,遍历每一行并“看到”它,以确保它是可见的。然后将它们相加,这是所有行都以当前宽度显示所需的最小新高度。根据行的bbox高度和行中最大字体的高度,如果你关心的话,你可以确定行是否被换行,如果是的话,多少次。诀窍是然后使用paneconfig()
来修改窗格窗口的 height。即使子窗口会自动调整大小,窗格窗口也不会。它必须通过paneconfig()
调用来告诉它调整大小。如果你在测量之前“看到”每一行,你就会得到所有的测量结果。“看到”每一行不应该是一个大问题,因为你打算在最后显示它们。