如何正确地将项目与“side=BOTTOM”/“anchor=S”对齐?

Posted

技术标签:

【中文标题】如何正确地将项目与“side=BOTTOM”/“anchor=S”对齐?【英文标题】:How to align items with "side=BOTTOM"/"anchor=S" properly? 【发布时间】:2021-10-09 19:11:02 【问题描述】:

我有一个 GUI 应用程序,其中底部有一个 BOTTOM 滚动条和一个 BOTTOM 状态栏。我想以这样的方式对齐它们,使滚动条位于底部的状态栏上方,如下所示(在官方记事本中):

这里状态栏在底部,滚动条在顶部。

但是我所做的是:

这里状态栏在顶部,滚动条在底部。

我也尝试了 anchor=S,但也没有成功并抛出了相同的结果。

代码:(状态栏)

    statusbar = Frame(textarea)
    statusbar.pack(side=BOTTOM, fill=X)
    statusbar_Content1 = Label(statusbar, anchor=SW, width=18, text="Ln 1, col 1")
    statusbar_Content2 = Label(statusbar, anchor=SW, text="100%")
    statusbar_Content3 = Label(statusbar, anchor=SW, width=15, text="Windows (CRLF)")
    statusbar_Content4 = Label(statusbar, anchor=SW, width=13, text="UTF-8")
    statusbar_Content4.pack(side=RIGHT)
    Label(statusbar, anchor=SW, text="|", state=DISABLED).pack(side=RIGHT)
    statusbar_Content3.pack(side=RIGHT)
    Label(statusbar, anchor=SW, text="|", state=DISABLED).pack(side=RIGHT)
    statusbar_Content2.pack(side=RIGHT)
    Label(statusbar, anchor=SW, text="|", state=DISABLED).pack(side=RIGHT)
    statusbar_Content1.pack(side=RIGHT)
    Label(statusbar, anchor=SW, text="|", state=DISABLED).pack(side=RIGHT)

代码:(滚动条)

Scroll2 = Scrollbar(root, orient=HORIZONTAL)
Scroll2.pack(side=BOTTOM, fill=X)
Scroll2.config(command=textarea.xview)

代码:(滚动条与文本小部件绑定)

textarea = Text(root, font=fontsmain, yscrollcommand=Scroll.set,xscrollcommand=Scroll2.set, undo=True)
textarea.pack(expand=True, fill=BOTH)

结论:

有什么方法可以设置这些,使 SCROLLBAR 高于 STATUSBAR,反之亦然?

【问题讨论】:

【参考方案1】:

pack 通过在未分配空间的一侧放置一个小部件来工作。这意味着结果取决于小部件的打包顺序。这称为堆叠顺序

例如,如果您先打包滚动条,它将被放置在窗口的最底部,因为尚未分配任何空间。当您稍后在状态栏上调用pack 时,窗口的最底部已经被分配,因此它将被放置在滚动条上方空闲空间的底部。

了解这一点后,当您更改调用pack 的顺序时,您就会更改窗口中小部件的显示顺序。因此,一个简单的解决方案是确保在打包滚动条之前打包状态栏。

pack 还有一些选项可以让您指定一个小部件是在排序中的某个其他小部件之前还是之后。例如,您可以打包滚动条,然后打包状态栏,但告诉它以堆叠顺序出现在滚动条之前。当您使用side='bottom' 时,这将导致状态栏出现在滚动条下方。

请注意以下三个示例之间的区别:

statusbar.pack(side="bottom", fill="x")
scrollbar.pack(side="bottom", fill="x")

scrollbar.pack(side="bottom", fill="x")
statusbar.pack(side="bottom", fill="x")

scrollbar.pack(side="bottom", fill="x")
statusbar.pack(side="bottom", fill="x", before=scrollbar)

【讨论】:

你的代码是正确的但是它不适用于我的代码,无论我先打包哪个小部件,当滚动条进入时它会占据底部,无论它是打包在代码顶部还是底部,不知道为什么? @AaYanYasin:这是因为您的代码没有按照正确的顺序打包内容。 pack 正在按照您的情况设计。这就是您负责创建准确反映您的问题的minimal reproducible example 的原因。你没有这样做,所以我们必须猜测丢失的部分。 不,我遗漏了一行代码,您的代码运行良好,我已将其标记为正确,如果您支持我的回答,我们将不胜感激,因为我因没有得到良好的响应而被禁止。

以上是关于如何正确地将项目与“side=BOTTOM”/“anchor=S”对齐?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将库与 cmake 链接?

如何正确地将 OData 与 ASP.net Core 集成

需要的建议:如何正确地将 React 连接到 MongoDB

如何正确地将特定对象列表转换为 Gson?

如何正确地将“单元格项目”从 SwiftUI LazyVGrid 传递给 .sheet?

如何正确地将“单元格项目”从 SwiftUI LazyVGrid 传递给 .sheet?