Tkinter:tk.Text 小部件中的高度/宽度缩放问题

问题描述

我似乎无法使此文本上的滚动条起作用。文本会滚动到一定程度,但之后不会出现。我相信文本小部件的高度不是我想要的。例如,下图仅显示了遗伝子实际结果的一半左右(我可以通过尝试从框架中间的一段文字拖到底部来找到)。宽度也与我希望的框架尺寸不同:数字 23 只是看起来有效的东西。

如果我这样做

txt = tk.Text(self.SEARCH_RESULTS_TEXT_FRAME,width=self.SEARCH_RESULTS_FRAME_WIDTH,height=20,background='#d9d9d9',relief=RIDGE)

...宽度变得太大了。我会认为它只会占用框架的大小,即 240。

注意 SEARCH_RESULTS_TEXT_FRAME 是红色的框。

相关代码

    #search text frame
    self.SEARCH_RESULTS_FRAME_HEIGHT = 240 #240
    self.SEARCH_RESULTS_FRAME_WIDTH = self.TITLE_FRAME_WIDTH - 23
    self.SEARCH_RESULTS_TEXT_FRAME = Frame(self.SEARCH_RESULTS_FRAME,height=self.SEARCH_RESULTS_FRAME_HEIGHT,width=self.SEARCH_RESULTS_FRAME_WIDTH)
    self.SEARCH_RESULTS_TEXT_FRAME.place(x=10,y=10,anchor = NW)
    self.SEARCH_RESULTS_TEXT_FRAME.config(background ="#adadad")

def print_dict_to_frame(self,results_list):
    txt = tk.Text(self.SEARCH_RESULTS_TEXT_FRAME,width=34,relief=RIDGE)
    txt.place(x=0,y=0)
    txt.tag_configure('header',justify = 'center',font=("Meiryo",12,'bold'))
    txt.tag_configure('entry',font=('Meiryo',8))
    for r_list in results_list:
        header = r_list[0]
        entry = r_list[1]
        txt.insert(tk.END,"{}\n".format(header),'header')
        for single_result in entry:
            txt.insert(tk.END,single_result+"\n",'entry')
    txt.configure(state=disABLED)

Relevant image of the frame. Note that it is behind the text entry (in red)

如何让文本小部件只占用框架的宽度和框架的高度,允许滚动?

解决方法

如果我这样做txt = tk.Text(self.SEARCH_RESULTS_TEXT_FRAME,width=self.SEARCH_RESULTS_FRAME_WIDTH,height=20,background='#d9d9d9',relief=RIDGE) ... the width becomes much too large. I would have thought that it would only take up the size of the frame,which is 240.

width 选项以字符数而非像素数指定宽度。如果您使用值 240,则宽度将是您使用的字体中平均字符宽度的 240 倍。

如何让文本小部件只占用框架的宽度和框架的高度,允许滚动?

将文本小部件的宽度和高度设为 1,然后让几何管理器(packplacegrid)负责拉伸它以适合框架。

由于您使用的是 place,因此您可以使用 relwidthrelheight 选项使其成为框架的完整尺寸:

txt.place(x=0,y=0,anchor="nw",relwidth=1.0,relheight=1.0)

就我个人而言,我建议在几乎所有情况下都使用 packgrid。使用它们创建响应式 UI 比使用 place 容易得多。