【问题标题】:How can the order of widgets in tkinter be changed?如何更改 tkinter 中小部件的顺序?
【发布时间】:2022-01-16 11:50:17
【问题描述】:

下面脚本中的on_change_order方法如何实现?

import tkinter as tk


root = tk.Tk()

# Inserts labels 1 and 2 in sequence, using .pack() method
label1 = tk.Label(root, text="Label 1", bg="red", fg="white")
label1.pack(padx=5, pady=15, side=tk.LEFT)
label2 = tk.Label(root, text="Label 2", bg="green", fg="white")
label2.pack(padx=5, pady=20, side=tk.LEFT)

def on_change_order():
    """Swaps the .pack() order of the labels 1 and 2 appearing before the button."""
    pass  # How can this be done?

button = tk.Button(root, text='Change order', command=on_change_order)
button.pack()

root.mainloop()

当应用打开时,标签 1 首先出现,标签 2 出现在第二个。但是,当我单击“更改订单”按钮时,我希望标签切换位置。也就是说,我想让回调 on_change_order 改变一些东西,然后让 Label 2 首先出现,Label 1 出现在第二次。

也就是说,你如何改变https://www.tcl.tk/man/tcl8.6/TkCmd/pack.html#M27中提到的“装箱单”的元素顺序?

【问题讨论】:

  • 使用grid()交换小部件更容易。

标签: python tkinter


【解决方案1】:
def on_change_order():
    label1.pack_forget()
    label2.pack_forget()
    label2.pack(padx=5, pady=10, side=tk.LEFT)
    label1.pack(padx=5, pady=10, side=tk.LEFT)
    button.pack(after=label1)  

我想你正在寻找这个。请注意,“更改订单”按钮不固定。如果你想让它保存它在右边的位置,你应该在 label1 之后设置它

【讨论】:

  • 我不太明白button.pack(after=label1)这行。每次调用on_change_order 时都需要这样做吗?
  • 您没有为此按钮指定准确的位置。在您的代码中,它出现在最后一个标签之后,但如果我们交换标签,按钮将出现在其他地方(在框架的顶部,但我无法解释原因)。在 label1 找到比 label1 更正确的按钮之后设置它,就像在按下按钮之前一样。如果按钮的位置很重要,则不能删除此行
【解决方案2】:

对于您的情况,您可以在button之前重新包装所需的标签:

def on_change_order():
    """Swaps the .pack() order of the labels 1 and 2 appearing before the button."""
    if root.pack_slaves()[0] == label1:
        label1.pack(before=button)
    else:
        label2.pack(before=button)

但是使用grid manager 更容易重新定位小部件。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2020-12-16
    • 2021-10-30
    • 1970-01-01
    • 2021-12-18
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多