【问题标题】:tkinter resize window without scrollbar disappearingtkinter 调整窗口大小而没有滚动条消失
【发布时间】:2018-11-16 14:28:39
【问题描述】:

我一直在编写一个几乎是花哨的文本编辑器的应用程序,但在调整其中的小部件大小时遇到​​了问题。我的目标是让它看起来有点像带有水平滚动条的 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 记事本。

【问题讨论】:

  • 您的代码无法运行。从 ttk 未导入、root 未定义、宽度未定义等开始有许多错误。请阅读this article 并编辑。

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


【解决方案1】:

这是一个比较容易解决的问题。

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

这些允许您在容器小部件的范围内设置Grid 几何管理器的配置选项。具体来说,我们关心的属性是weight。正如here解释的那样:

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

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

(强调我的)

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

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)

【讨论】:

  • grid 如果同时有水平和垂直滚动条肯定会更好。使用pack,或者水平滚动条的右边缘在垂直滚动条的下方,或者垂直滚动条的底部在水平滚动条的右侧。其中任何一个看起来都有些草率。
  • @BryanOakley 是的。我做了一个改变,说明了这一点。假设垂直条从不改变粗细,您可以将padx 添加到值为VERTICAL_WIDGET.winfo_width() 的水平条。不完美,因为它两侧都有,但它是你能得到的最好的。
  • 谢谢,我会试试看的!而且我可能可以同时使用包和网格,因为框架是一个不同的区域,没有使用地理管理器,也就是将网格用于外部框架并在内部打包
  • @EthanField 感谢您的帮助!它已经完成了我所需要的!
猜你喜欢
  • 2016-05-24
  • 2021-04-27
  • 2018-05-11
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多