我一直在编写一个几乎是精美的文本编辑器的应用程序,并且在调整其内部小部件的大小时遇到了问题。我的目标是使它看起来也像带有水平滚动条的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记事本中的自动换行功能。
答案 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)