【问题标题】:How to swap two widgets' x position in tkinter?如何在 tkinter 中交换两个小部件的 x 位置?
【发布时间】:2021-01-12 09:22:08
【问题描述】:

我需要创建一个函数,该函数将两个小部件及其放置的框架作为参数。 我想交换他们的 X 位置,但我想不出正确的方法。这是我尝试过的:

def swap(w1, w2, frame):
    x1 = w1.winfo_x()
    x2 = w2.winfo_x()
    w1.place(x=x2)
    w2.place(x=x1)
    frame.update()

这样做的正确方法是什么?这是正确的方法吗?

【问题讨论】:

  • 如果两个小部件首先使用place(),您的代码就可以正常工作。
  • 我首先使用 place(),但是使用这段代码,元素都从窗口中消失了
  • 尝试打印出x1x2,看看它们是否是你想要的。
  • 请创建一个minimal reproducible example。当我们对丢失的代码进行合理猜测时,您发布的代码可以正常工作。如果您能提供完整的minimal reproducible example,那将有很大帮助。
  • 你做了什么来调试这个?您是否验证了计算得到的 x1x2 是您所期望的?

标签: python python-3.x tkinter widget


【解决方案1】:

您可以使用place_configure更改位置。

这是一个交换两个标签的例子:

from tkinter import *

def swap():
    root.update()
    x1 = label.winfo_x()
    x2 = label2.winfo_x()

    label.place_configure(x=x2)
    label2.place_configure(x=x1)
    
root = Tk()

label = Label(root, text='Hello')
label.place(x=100, y=100)

label2 = Label(root, text='Hello2')
label2.place(x=150, y=100)

btn = Button(root, text='Swap', command=swap)
btn.place(x=125, y=150)

root.mainloop()

【讨论】:

  • 我试过了,但不幸的是这仍然给我带来了问题:第一个元素被正确放置在第二个元素的位置,但第二个元素由于某种原因消失了。这是因为我将这些值作为参数而不是使用全局变量传递吗?
  • @Daniel 你能出示你的代码让我检查吗?这也可能是由于第二个元素的宽度可能太大,以至于第一个元素在交换时被第二个元素覆盖。
  • 元素的宽度都是一样的。这是代码:def swap(w1, w2, frame): frame.update() x1 = w1.winfo_x() x2 = w2.winfo_x() w1.place_configure(x=x2) w2.place_configure(x=x1)
  • 这个交换函数被另一个函数调用:def quick_sort_algorithm(frame): widgets = frame.winfo_children() swap(widgets[0], widgets[-1], frame)
  • @Daniel 我想知道 w1 和 w2 是什么,还有你为什么将它们作为参数传递?
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 2021-06-09
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多