如何将tkinter窗口居中并保持“适合子控件”的行为?

3

我有一个内容会变化的窗口,有时内容比窗口更大,因此窗口会扩展以适应其子元素。但是,当我使用"geometry"调用来居中窗口时,窗口不再自动调整大小。下面是示例代码。

如果您注释掉延迟的center()函数调用,您会注意到窗口会扩展以适应其内容。如果保留它,窗口将居中,但不再扩展以适应其内容。

是否可能同时使窗口居中并继续调整大小以适应其内容?

from Tkinter import *
import ttk

def center(root):
    w = root.winfo_screenwidth()
    h = root.winfo_screenheight()
    rootsize = tuple(int(_) for _ in root.geometry().split('+')[0].split('x'))
    x = w/2 - rootsize[0]/2
    y = h/2 - rootsize[1]/2
    root.geometry("%dx%d+%d+%d" % (rootsize + (x, y)))

root = Tk()
var = StringVar()
var.set('Small Text')

label = ttk.Label(root, textvariable=var)
label.grid(column=0, row=0)

# Change the text label in a couple of seconds.
def changeit():
    var.set('BIG TXT - ' * 5)
root.after(2000, changeit)

# Comment out this center call and the label expands.
root.after(100, lambda: center(root))
root.mainloop()
1个回答

2

调用 Geometry 命令时,不要提供宽度和高度,只需提供 x/y 值即可。当您提供明确的宽度和高度时,就告诉了 Tk“我希望窗口大小正好是这个”,从而关闭了其自动调整大小的行为。

root.geometry("+%d+%d" % (rootsize + (x, y)))

此外,您可以使用winfo_width()winfo_height()来获取窗口的实际大小,而无需解析geometry方法的输出。请保留HTML标签。

这太完美了,谢谢! 我曾尝试过如何设置x,y坐标而不需要大小,但从未想出。再次感谢! - jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接