我正在使用 Python 来解析日志文件中的条目,并使用 Tkinter 显示条目内容,到目前为止效果非常好。输出是标签小部件的网格,但有时行数多于屏幕上可以显示的行数。我想加一个滚动条,看起来应该很容易,但我想不通。
文档暗示只有 List、Textbox、Canvas 和 Entry 小部件支持滚动条界面。这些似乎都不适合显示小部件网格。可以在 Canvas 小部件中放置任意小部件,但您似乎必须使用绝对坐标,所以我无法使用网格布局管理器?
我试过将小部件网格放入框架中,但这似乎不支持滚动条界面,所以这不起作用:
mainframe = Frame(root, yscrollcommand=scrollbar.set)
任何人都可以提出解决此限制的方法吗?我不想不得不在 PyQt 中重写并增加我的可执行图像大小,只是为了添加一个滚动条!
原文由 Simon Hibbs 发布,翻译遵循 CC BY-SA 4.0 许可协议
概述
您只能将滚动条与几个小部件相关联,而根小部件和
Frame
不属于该组小部件。至少有几种方法可以做到这一点。如果您需要一组简单的垂直或水平小部件,您可以使用文本小部件和
window_create
方法来添加小部件。此方法很简单,但不允许小部件的复杂布局。一个更常见的通用解决方案是创建一个画布小部件并将滚动条与该小部件相关联。然后,在该画布中嵌入包含标签小部件的框架。确定框架的宽度/高度并将其输入画布
scrollregion
选项,以便滚动区域与框架的大小完全匹配。为什么将小部件放在框架中而不是直接放在画布中?附加到画布的滚动条只能滚动使用
create_
方法之一创建的项目。您无法使用pack
、place
或grid
滚动添加到画布的项目。通过使用框架,您可以在框架内部使用这些方法,然后为框架调用create_window
一次。直接在画布上绘制文本项并不难,因此如果框架嵌入画布解决方案看起来过于复杂,您可能需要重新考虑该方法。由于您正在创建一个网格,因此每个文本项的坐标将非常容易计算,尤其是当每一行的高度相同时(如果您使用的是单一字体,则可能是这样)。
要直接在画布上绘图,只需计算出您正在使用的字体的行高(并且有相应的命令)。然后,每个 y 坐标是
row*(lineheight+spacing)
。 x 坐标将是基于每列中最宽项目的固定数字。如果你给每样东西一个它所在列的标签,你可以用一个命令调整列中所有项目的 x 坐标和宽度。面向对象的解决方案
下面是框架嵌入画布解决方案的示例,使用面向对象的方法:
程序解决方案
这是一个不使用类的解决方案: