如何确定所需的窗口大小?

4

我有一个窗口,其中包含一个标签w,其文本可以是给定种类中的任何一种(在这种情况下为“Hello World!”,分别出现一次、两次和三次):

from Tkinter import *
import time

root = Tk()
text = "Hello, World! "
w = Label(root)

for i in range(1, 4):

    w["text"] = text*i
    w.update_idletasks()
    w.grid()
    w.update_idletasks()
    time.sleep(1)

root.mainloop()

我想将窗口的大小设置为固定宽度。这个宽度应该是可能出现的最长文本所需的宽度。如何最轻松地实现这一目标?我必须循环遍历所有可能的文本,读取相应的窗口宽度,并将最终宽度设置为这些值中的最大值吗?如果这是最好的方法,那么如何在窗口不出现在屏幕上的情况下完成此操作?


有趣的问题加1。在Tk中有一个“font measure”子命令,它返回字符串的像素宽度,但是您必须考虑边框等因素。对于标签,有“winfo reqwidth”,但我不确定在标签文本更新之间是否需要“update idletasks”。 - Anton Kovalenko
2个回答

1
如果您不遍历文本,如何知道最大文本的大小?唯一可能的方法是提前知道每个文本的大小,但那样的话您已经解决了问题。因此,您只需要设置标签并检查窗口所需的宽度,然后检查该宽度是否大于当前最大值,如果需要,则更新它。如果在此过程中窗口出现,您可以调用withdraw,执行您需要的所有操作,然后调用deiconify
import time
import random
import Tkinter

root = Tkinter.Tk()
root.withdraw()

text = "Hello, World! "
w = Tkinter.Label()
w.grid()

maxwidth = 0
for _ in range(10):
    i = random.randint(1, 5)
    w["text"] = text*i
    print i
    w.update_idletasks()
    maxwidth = max(maxwidth, root.winfo_reqwidth())

root.wm_minsize(maxwidth, root.winfo_reqheight())
root.wm_maxsize(maxwidth, int(1e6))
root.deiconify()

root.mainloop()

winfo_reqwidth() 似乎是解决方案。确实,必须检查所有可能的文本所需的宽度。但是,winfo_reqwidth() 不会更改窗口宽度(如果我没有弄错的话),而是告诉需要哪个窗口宽度。窗口可以在最后调整大小,就像上面的示例中所示。 - Michael Westwort
我知道winfo_reqwidth不会改变窗口的宽度,这不是它的作用。wm_minsizewm_maxsize被用于此目的。窗口仍然可以在垂直方向上调整大小,我不明白你在抱怨什么。你能更清楚地说明这个答案为什么不能完全解决问题吗?它将窗口的宽度设置为最大标签所需的宽度。 - mmgp
这段代码每次都会得出不同的答案,介于“Hello, World!”长度的1到5倍之间。我对它如何构成固定宽度感到困惑。 - Junuxx
@Junuxx,你看到 print i 的结果了吗? - mmgp

0
你可以为标签设置固定宽度,并使用textwrap模块换行文本。textwrap.wrap(text, width)将把text分成不超过width个字符的行。它还具有在长单词或连字符处断开的选项,但请参阅文档了解更多信息。

enter image description here

from Tkinter import *
import time
import textwrap

root = Tk()
text = "Hello, World! "
w = Label(root, width=35)
w.grid()

for i in range(1, 4):
    w.update()
    s = text*i 
    s = "\n".join(textwrap.wrap(s, 21))

    w["text"] = s
    time.sleep(1)

root.mainloop()

"textwrap" 可能是保持固定宽度的好方法,但它会影响窗口的高度。 - Michael Westwort
@Michael:没错。你也可以将高度固定。如果文本长度没有上限,你可以添加滚动条以确保所有文本都可读。 - Junuxx
@Junuxx,既然你已经决定了标签的宽度(这显然与问题相悖),为什么还要打这么多update_idletasksgrid呢? - mmgp
@mmgp:哦,对了。我只是复制了OP的代码并进行了一些修改,没有清理干净。已编辑。 - Junuxx

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