tkinter调整大小窗口而滚动条不消失

时间:2018-11-16 14:28:40

标签: python python-3.x tkinter python-3.7

我一直在编写一个几乎是精美的文本编辑器的应用程序,并且在调整其内部小部件的大小时遇到​​了问题。我的目标是使它看起来也像带有水平滚动条的IDLE。

from tkinter import *
from tkinter import ttk

root = Tk()

width = preset frame width in relation to root
hieght = preset frame height in relation to root

frame = ttk.Frame(master=root, width=width, height=height)
frame.grid()
frame.grid_propagate(False)

vbar = ttk.Scrollbar(root, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.grid(row=0, column=1, sticky=N S)
hbar.grid(row=1, column=0, sticky=E W)

text_widget = Text(frame, width=189, height=47, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.grid()

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)

我正在使用python 3.7,Windows 10和PyCharm。如果您发现此问题重复,请先发表评论并让我先检查一下,然后再标记为重复或结束,因为我还没有找到答案。它有效,只是调整大小是问题。它的行为应该有点像Windows记事本中的自动换行功能。 Editor in split-screen

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个相对简单的问题。

如果您希望继续使用Grid几何管理器创建程序,则需要熟悉Grid.rowconfigure()Grid.columnconfigure()函数。

这些按钮可让您在容器窗口小部件的范围内为Grid几何管理器设置配置选项。具体来说,我们关心的属性是weight。如here所述:

  

每个列和行都有一个与之关联的“权重”网格选项,它告诉它如果母版中有多余的空间可以填充,则应增长多少。默认情况下,每列或每行的权重为0,表示请勿扩展以填充空间。

     

然后要调整用户界面的大小,我们需要为要扩展的列赋予正的权重。这是使用网格的“ columnconfigure”和“ rowconfigure”方法完成的。如果两根柱子的权重相同,它们将以相同的速度膨胀;如果一个像素的权重为1,另一个像素的权重为3,则第一个像素的权重将增加三个像素。

(重点是我的)

因此,在这种情况下,我们需要进行一些更改。首先,我们需要将sticky = "NESW"添加到frame.grid()text_widget.grid()调用中,否则Text小部件将不会随滚动条扩展。其次,我们需要将以下代码段添加到程序中:

Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)

Grid.columnconfigure(frame, 0, weight=1)
Grid.rowconfigure(frame, 0, weight=1)

这以下面的程序结尾(进行了一些更改,以便我可以实际运行所提供的示例):

from tkinter import *
from tkinter import ttk

root = Tk()

frame = ttk.Frame(master=root)
frame.grid(sticky="NSEW")

vbar = ttk.Scrollbar(root, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.grid(row=0, column=1, sticky="NS")
hbar.grid(row=1, column=0, sticky="EW")

text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.grid(sticky="NSEW")

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)

Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)

Grid.columnconfigure(frame, 0, weight=1)
Grid.rowconfigure(frame, 0, weight=1)

请注意,使用Pack几何管理器重建该程序非常简单,它在调整窗口小部件大小时(主观上)更加智能:

from tkinter import *
from tkinter import ttk

root = Tk()

frame = ttk.Frame(master=root)
frame.pack(expand=True, fill="both")

vbar = ttk.Scrollbar(frame, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.pack(side="right", fill="y")
root.update()
hbar.pack(side="bottom", fill="x", padx=vbar.winfo_width())

text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.pack(expand=True, fill="both")

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)