调整滚动Tkinter文本框大小

1 投票
1 回答
4597 浏览
提问于 2025-04-16 08:25

我想做一个可以滚动的Tkinter文本框,让它尽量占满所有可用的空间。我现在有点搞定了……

但是有个奇怪的情况,当我拉伸窗口的时候,文本框显示得很好;可是,滚动条在水平方向上却有很多空白。

第二个问题是,当我缩小窗口的时候,滚动条就会跑到屏幕外面。

有没有人知道这两个问题的解决办法?

代码片段:

    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)

1 个回答

7

你的滚动条之所以有那么多的边距,是因为你使用了 fill='both'。虽然这是一个垂直滚动条,但你让它在水平方向上也占用额外的空间,这就导致了边距的出现,因为滚动条本身不会拉伸变宽。你希望垂直滚动条只在Y方向填充,而水平滚动条则在X方向填充。

至于滚动条超出屏幕,这个问题有点复杂,但解决方法很简单。

问题是这样的:如果你把一个由 pack 管理的窗口缩小到比里面的控件所需的空间还小,它就会开始裁剪控件。这个过程是按顺序处理控件的,先布局窗口,然后把剩下的空间分配给其他控件。这意味着,如果一个控件在顺序中占用了所有剩余的可视空间,后面的控件就不会显示出来。

上面提到的“顺序”就是打包列表的顺序,具体来说,就是控件被打包的顺序。所以,如果你先打包文本控件,然后再打包滚动条,Tk会先布局文本控件,剩下的空间才会分配给滚动条。如果你先打包滚动条,它会先布局,剩下的空间才会给文本控件。

听起来很复杂,但有趣的是,如果你按照正确的顺序打包,所有的事情就会顺利进行。

一般的经验法则是,确保你最后打包的控件是设置了 expand 为真的控件。这就是你的“弹性”控件。这样,所有固定大小的控件会先占用它们需要的空间,而你的“弹性”控件会占用剩下的所有空间。

还有另一种解决方案,就是给你的文本控件设置一个宽度和高度为1。这样,当打包器最初分配空间时,它只会分配很小的空间。因此,当窗口缩小时,文本控件会缩小到这个小尺寸。不过,这样做并不太实用,因为打包的一个很棒的特点是你可以让所有控件根据它们的内容自动调整大小(比如按钮和标签),而打包器会处理所有的工作。如果你把宽度和高度设置为1,你的初始窗口(除非明确设置为更大的尺寸)会非常小。

这种行为在pack的手册中都有记录,不过你得仔细阅读才能完全理解这种行为。

撰写回答