我想创建一个滚动的Tkinter文本框,填充最大的分配空间。我有点工作...
出于某种原因,当我拉伸窗口时,文本小部件很好;但是,滚动条在x轴上获得了大量的填充。
第二个问题是当我缩小窗口滚动条离开屏幕时。
有谁知道这两个程序的解决方案?
片段:
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)
答案 0 :(得分:6)
您的滚动条获取所有填充,因为您使用fill='both'
。即使它是一个垂直滚动条,你也要求它沿x轴占据额外的空间,这会导致填充,因为滚动条本身不会伸展以形成一个宽滚动条。您希望垂直滚动条仅填充Y方向,而水平方向填充X方向。
关于滚动条离开屏幕,这有点复杂,但它有一个简单的解决方案。
问题在于:如果将pack
管理的窗口缩小到小于内部窗口小部件所需的窗口,则会开始剪切窗口小部件。它的工作方式是按顺序处理小部件,布置窗口,然后为剩余的小部件分配任何剩余空间。这意味着如果订单中的早期窗口小部件占用了所有剩余的可视空间,则不会显示任何后续窗口小部件。
上面提到的“订单”是装箱单的顺序。具体而言,包装物品的顺序。因此,如果您打包文本小部件然后滚动条Tk将首先布置文本小部件,并且任何剩余空间将分配给滚动条。如果您先打包滚动条,它将被布局,任何剩余的空间都将被赋予文本小部件。
这一切听起来都非常复杂,但很酷的是,如果按正确的顺序打包东西,那一切都可行。
一般的经验法则是确保您打包的最后一个小部件是expand
设置为true的小部件。这是你的“弹性”小部件。这样,所有固定大小的小部件将占用他们首先需要的任何空间,而你的“弹性”小部件将占用剩余的所有空间。
还有另一种解决方案是为文本窗口小部件提供一个请求的宽度和高度。这样,当封隔器最初分配空间时,它将仅分配少量空间。因此,当窗口缩小时,文本小部件将缩小,直到它变小到那么小的大小。这不是很实用,因为pack的一个很棒的功能是你可以给所有小部件它们的自然尺寸(或者它们根据它们的内容在按钮和标签的情况下假定它们的自然尺寸)并且包装器完成所有工作。如果将宽度和高度设置为1,则初始窗口(除非明确设置为更大的尺寸)将相当小。
此行为全部记录在pack的手册页中,但您必须非常仔细地阅读它才能完全掌握此行为。