【问题标题】:Resizing a Scrolled Tkinter Text Box调整滚动的 Tkinter 文本框的大小
【发布时间】:2011-05-24 05:02:34
【问题描述】:

我想制作一个滚动的 Tkinter 文本框,以填充最大分配空间。我有它的工作方式......

由于某种原因,当我拉伸窗口时,文本小部件很好;但是,滚动条在 x 轴上有大量的填充。

第二个问题是当我缩小窗口时,滚动条会离开屏幕。

有人知道这两个程序的解决方案吗?

sn-p:

    self.Fr = Tkinter.Frame(self, width=self.Wi, height=self.He)
    self.Fr.pack(side='right', fill='both', expand='yes')


    self.Te = Tkinter.Text(self.Fr, font=self.Fo, fg=self.FG, bg=self.BG,
                           selectforeground=self.SFG,
                           selectbackground=self.SBG,
                           insertbackground=self.IBG, wrap='word',
                           undo=True, maxundo=100)
    #self.Te.grid(column=0, row=0, sticky='NSEW')
    self.Te.pack(side='left', fill='both', expand='yes')


    self.Sc = Tkinter.Scrollbar(self.Fr, elementborderwidth=1)
    #self.Sc.grid(column=1, row=0, sticky='NSEW')
    self.Sc.pack(side='right', fill='both', expand='yes')

    self.Te.configure(yscrollcommand=self.Sc.set)
    self.Sc.configure(command=self.Te.yview)

【问题讨论】:

    标签: python text tkinter


    【解决方案1】:

    因为您使用了fill='both',所以您的滚动条获得了所有的填充。即使它是一个垂直滚动条,您也要求它沿 x 轴占用额外空间,这会导致填充,因为滚动条本身不会拉伸以形成宽滚动条。您希望垂直滚动条只填充 Y 方向,水平滚动条填充 X 方向。

    关于滚动条离开屏幕,解释起来有点复杂,但有一个简单的解决方案。

    问题是这样的:如果您将由pack 管理的窗口缩小到小于内部小部件所需的窗口,它就会开始剪切小部件。它的工作方式是按顺序处理小部件,布置窗口,然后为任何剩余的小部件分配任何剩余空间。这意味着如果订单中较早的小部件占用了所有剩余的视觉空间,则任何后面的小部件都不会出现。

    上面所说的“顺序”就是装箱单的顺序。具体来说,物品的包装顺序。因此,如果您打包文本小部件,然后滚动条 Tk 将首先布置文本小部件,并且任何剩余空间都将分配给滚动条。如果您首先打包滚动条,它将被布置并且任何剩余空间都将提供给文本小部件。

    这听起来很复杂,但很酷的是,如果你以正确的顺序打包东西,一切都会奏效。

    因此,一般的经验法则是确保您打包的最后一个小部件是 expand 设置为 true 的小部件。这是您的“弹性”小部件。这样,所有固定大小的小部件将首先占用它们需要的任何空间,而您的“弹性”小部件将占用剩下的所有空间。

    还有另一种解决方案是为您的文本小部件提供一个请求的宽度和高度。这样,当打包程序最初分配空间时,它只会分配少量空间。因此,当窗口缩小时,文本小部件将缩小,直到它缩小到那个小尺寸。但这不是很实用,因为 pack 的一大特点是您可以为所有小部件赋予其自然大小(或者在按钮和标签的情况下,它们会根据其内容假定它们的自然大小)并且打包器会完成所有工作工作。如果将宽度和高度设置为 1,则初始窗口(除非明确设置为更大的尺寸)会相当小。

    这种行为都记录在 pack 的手册页中,但您必须仔细阅读才能完全掌握这种行为。

    【讨论】:

    • 哇,这是一些非常好的信息。我主要使用 .grid 和 .place 方法。因此,我对 .pack 方法的工作原理只有模糊的了解。这无疑消除了我的误解。
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多