tkinter 中的 .place() 函数对文本、条目和按钮使用不同的左窗口锚点?

问题描述 投票:0回答:1

我根据代码中看到的图像宽度以相同的方式放置文本、条目和按钮。当我现在使窗口大于图像宽度时,按钮开始移动,就像它们使用窗口的左侧作为参考点一样,而文本和条目仍然使用图像角作为参考点。这种行为的原因是什么以及如何预防?

enter image description here 当增加窗口宽度时,只有按钮使用新的窗口大小作为新的参考。文本和条目以图像角作为参考。 enter image description here

编辑:行为的最小代码示例

import tkinter as tk
from PIL import Image, ImageTk

# random pil image
image = Image.new('RGB', (800, 600), color = 'red')
img_shape = image.size

root = tk.Tk()
canvas = tk.Canvas(root, width=img_shape[0], height=img_shape[1] + 50)

tk_image = ImageTk.PhotoImage(image=image)
canvas.create_image(0, 0, anchor='nw', image=tk_image)
canvas.pack()

depth_min_entry = tk.Label(canvas, text="right")
depth_min_entry.place(x=img_shape[0] - 65, y=img_shape[1] + 5, height=20, width=50, anchor='ne')
depth_min_entry = tk.Entry(canvas, width=6)
depth_min_entry.place(x=img_shape[0] - 10, y=img_shape[1] + 5, height=20, width=50, anchor='ne')
depth_min_entry.insert(0, 5)

camera_info = tk.Label(canvas, text=f"left")
camera_info.place(x=10, y=img_shape[1] + 5, height=20, width=50, anchor='nw')

update_button = tk.Button(root, text="b right")
update_button.place(x=img_shape[0] - 10, y=img_shape[1] + 25, height=20, width=100, anchor='ne')

prev_button = tk.Button(root, text="b left")
prev_button.place(x=10, y=img_shape[1] + 25, height=20, width=100, anchor='nw')

root.mainloop()
python tkinter tkinter-entry tkinter-button tkinter-layout
1个回答
0
投票

place
使用相对于小部件父级的坐标。由于您的小部件有不同的父级,因此在使用
place
时它们可能具有不同的起源。

由于标签和条目位于画布中,因此坐标将相对于画布。您使用

pack
将画布放在根窗口中,默认情况下
pack
将小部件沿一侧(在本例中为顶部)居中。因此,当您使窗口变大时,画布会向内移动,并且画布内的小部件也会移动。但是,画布外部的小部件不会移动,因为它们是相对于根窗口的。

您可以通过多种不同的方式来防止这种情况发生。也许最简单的方法就是使所有小部件成为画布的子部件。

另一个解决方案是为按钮创建一个框架,并为其使用适当的

pack
选项。这将为按钮提供画布和框架。

我认为最好的解决方案是根本不使用

place
。相反,在这种特殊情况下请考虑使用
grid

© www.soinside.com 2019 - 2024. All rights reserved.