Python tkinter在不消失滚动条的情况下调整窗口大小

Python tkinter在不消失滚动条的情况下调整窗口大小,python,python-3.x,tkinter,python-3.7,Python,Python 3.x,Tkinter,Python 3.7,我一直在编写一个应用程序,它是一个非常花哨的文本编辑器,我在调整它内部小部件的大小方面遇到了问题。我的目标是让它看起来有点像水平滚动条一样空闲 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(mas

我一直在编写一个应用程序,它是一个非常花哨的文本编辑器,我在调整它内部小部件的大小方面遇到了问题。我的目标是让它看起来有点像水平滚动条一样空闲

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记事本中的文字换行。


这是一个相对简单的问题

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

这些选项允许您在容器小部件的范围内设置网格几何管理器的配置选项。具体来说,我们关心的属性是
weight
。如前所述:

每一列和每一行都有一个与之相关联的“权重”网格选项,该选项告诉它如果主控中有额外的空间需要填充,它应该增长多少。默认情况下,每列或每行的权重为0,表示不展开以填充空间

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

(强调矿山)

因此,在这种情况下,我们需要做一些更改。首先,我们需要将
sticky=“NESW”
添加到
frame.grid()
text\u 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)
最后是以下程序(在做了一些更改之后,我可以实际运行提供的示例):


作为旁注,使用geometry manager重建此程序非常简单,在调整小部件大小时,geometry manager(主观上)更智能:

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)

您的代码无法运行。有许多错误,以未导入ttk、未定义根、未定义宽度等开头。请阅读并编辑。
grid
如果同时有水平和垂直滚动条肯定更好。使用
pack
,水平滚动条的右边缘在垂直滚动条的下方,或者垂直滚动条的底部在水平滚动条的右侧。这两个看起来都有点邋遢。@BryanOakley这是真的。我做了一个改变来解释这一点。假设垂直条从不改变厚度,您可以向水平条添加一个
padx
,其值为
vertical\u WIDGET.winfo\u width()
。不是很完美,因为它两边都有衬垫,但这是你能得到的最好的。谢谢,我会试试的!我可能可以同时使用pack和grid,因为框架是一个不同的区域,没有使用geo管理器,也就是使用grid作为外部框架和包装inside@EthanField谢谢你的帮助!它做了我所需要的!
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)